Мне интересно, возможно ли это, я хочу массово заменить текст в различных файлах, это не проблема. Что я не могу понять, или даже если это возможно, так это заменить текст определенным образом.

Например:

String = XXXXX_name($var1); 

XXXX фиксировано, поэтому XXXX заменить, например, на YYYY, достаточно просто. но более сложная часть:

($var1);

Я хочу вставить другую переменную, поэтому совпадение будет ");" <-- вставить перед этим, НО, если в строке уже есть две переменные ($var1,$var2);, чтобы ничего не вставлять.

Теперь, чтобы добавить еще одну вещь, Var1 и Var2 могут называться по-разному, поэтому совпадение должно быть if $ > 1 внутри (), затем ничего не делать, If $ = 1 inside () затем вставить ", $var2" до );

Строка = XXXXX_name($var1);
Должно стать: Строка = YYYYY_name($var1, var2);

0
Dave Hamilton 28 Окт 2021 в 18:00

1 ответ

Лучший ответ

Что-то вроде этого?

$ echo 'String = XXXXX_name($var1); ' | 
    sed -E -e 's/XXXXX_name\((\$[[:alnum:]_]+)\);/YYYYY_name\(\1, \$var2\);/'
String = YYYYY_name($var1, $var2); 

В расширенных регулярных выражениях круглые скобки без кавычек захватывают часть внутри них, а \1 sed помещает захваченную часть обратно в замещающую часть.

1
ilkkachu 28 Окт 2021 в 18:09
Просто проведите несколько тестов, и это может действительно сработать, именно так, как я надеялся. Это сэкономит мне много часов поиска и замены :) Спасибо, сэр.
 – 
Dave Hamilton
28 Окт 2021 в 18:22
Как бы вы сделали это и наоборот, если вы не возражаете, если я спрошу? Если вы куда вставить переменную в начале открытой скобки? Все в порядке, я вижу, что он переключает конец замены: sed -E -e 's/mssql_((\$[[:alnum:]_]+));/sqlsrv_query(\$var2\, \1);/ '
 – 
Dave Hamilton
28 Окт 2021 в 18:39
@DaveHamilton, ммм, я не понимаю, что ты имеешь в виду. \( соответствует буквальным левым скобкам, (...) фиксирует внутренности (до \1 в замещающей части), \$ соответствует буквальному знаку доллара, а [[:alnum:]_] любому количество буквенно-цифровых символов или знаков подчеркивания. И \) соответствует правой скобке. Итак, отредактируйте их по мере необходимости.
 – 
ilkkachu
28 Окт 2021 в 18:43
Ах, да, не имеет значения, где в замещающей части вы опускаете \1.
 – 
ilkkachu
28 Окт 2021 в 18:44
Есть ли что-то особенное в этом выражении, когда я передаю параметр -i, чтобы попытаться заменить содержимое в файле, он ничего не заменяет?
 – 
Dave Hamilton
29 Окт 2021 в 11:14