LINUX.ORG.RU

Заменить слово, игнорируя блоки

 , , ,


0

2

Необходимо заменить (sed, awk, perl,..) «long», но игнорируя комментарии, строки ("...") и т.п.

/*
   (...) long comment (...)
*/

   // not so long comment

   long l = 0;

/*
   (...) long comment (...)
*/

// not so long comment

printf("long message");

При портировании на си понадобилось поменять тип данных с long на, скажем, int32_t.

Регулярка для комментариев выглядит понятно:

(\/\*([\s\S]*?)\*\/)|(\/\/(.*))
Но как её «инвертировать», вроде:
s/?!(\/\*([\s\S]*?)\*\/)|(\/\/(.*))long/int32_t/g
?

★★★★★

Последнее исправление: gag (всего исправлений: 1)

Ух-ох. Проведи замену в несколько заходов. Сначала внутри комментариев long на, например l_o_n_g, потом замени long на int32_t, потом l_o_n_g на long.

kdask
()

Если long comment это не пример, а реальная строка, то вестимо надо отфильтровать такие строки сначала, дальше все элементарно

zolden ★★★★★
()

На правах юмора:

#define long int_32

Поставьте задачу точнее, кстати. Вам нужно заменить все long, кроме long-ов в комментах? То бишь и переменную

int price_tasty__chicken_longer_KFC=39
вы предлагаете преобразовать? И в двойных кавычках заменять тоже?
printf("long long ago far away...\n");

Pershin
()
Ответ на: комментарий от Pershin

Поставьте задачу точнее, кстати. Вам нужно заменить все long, кроме long-ов в комментах? То бишь и переменную

Это я указал в посте:

понадобилось поменять тип данных с long на, скажем, int32_t

Но вы правы, надо добавить и другие исключения, как printf().

int price_tasty__chicken_longer_KFC=39

должно решиться с помощью s/\blong\b/int32_t/g.

gag ★★★★★
() автор топика
Ответ на: комментарий от zolden

надо отфильтровать такие строки сначала

А потом у меня будет урезанный исходник или что это за фильтрация такая?

gag ★★★★★
() автор топика

Если в C-программист, то в чём проблема?

Чем вам не угодил собственно C? Напишите простейший конечный автомат, раз не можете осилить регулярку. Работы на 30 минут.

Считывайте символы по одному. Храните столько состояний, сколько вам нужно: комментарий открыт или закрыт, символ экранируется или нет, кавычки открыты или нет, etc.

А регулярное выражение ничего «помнить» не умеет, поэтому намучаетесь вы с ним куда больше.

Pershin
()
Ответ на: комментарий от gag

Не слушай Першина, он тебя плохому научит.
Работы на 30 минут, потом 2 дня на отладку и ловлю граничных случаев. Лучше за это время perl выучить

zolden ★★★★★
()

В таких делах рулит \G
C однострочным комментом «//» для закрепления попробуй сам справиться

$_ = <<END;
/*
   (...) long comment (...)
*/

   // not so long comment

   long l = 0;

/*
   (...) long comment (...)
*/

// not so long comment

printf("long message");
END

$WHAT    = 'long';
$REPLACE = 'int32_t';

while (pos() < length) {
	if (m%\G"%gc) {
		# "..."
		m%\G.*?(?<!\\)"%gs or die "no trailing quotes"
	}
	elsif (m%\G/\*%gc) {
		# /*...*/
		m%(\G.*?\*/)%gs or die "not closed comment";
	}
	elsif (m%\G(?=\b$WHAT\b)%gc) {
		$pos = pos;
		substr($_, $pos, length $WHAT) = $REPLACE;
		pos = $pos + length $REPLACE;
	}
	else {
		pos = pos() + 1;
	}
}

print;
Olegymous ★★★
()

При портировании на си понадобилось поменять тип данных с long на, скажем, int32_t

Возьми ide с нормальным рефакторингом и не мучай попу.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Возьми ide с нормальным рефакторингом и не мучай попу

Это лор, а не MSDN, дай нам повелосипедить, дьюд

zolden ★★★★★
()
Ответ на: комментарий от zolden

дай нам повелосипедить

Ну ок, буду ждать, когда в этом треде навелосипедят синтаксический анализатор C кода на sed.

no-such-file ★★★★★
()
Ответ на: комментарий от Olegymous

То, что нужно. Спасибо!

Хотя и не однострочник, зато и не write-only и всё понятно.

        elsif (m%\G//%gc) {
                m%\G.*%g;
        }

gag ★★★★★
() автор топика
Ответ на: комментарий от Zmicier

Вим не подойдет?

Редактирую в нём, но если уж писать не регулярку-однострочник, а скриптик, то на перле.

gag ★★★★★
() автор топика
Ответ на: комментарий от no-such-file

Возьми ide с нормальным рефакторингом

А есть какие не монстры типа эклипс?

gag ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.