sed edit string between spefic paragraph in a file

У меня есть файл, называемый a.txt. И он содержит следующее содержимое. Неизвестно, сколько строк между каждой функцией.

function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "test";
)

function c(
properties pro= "test";
)

Я хочу отредактировать

function b(
line 1;
line 2;
line ...;
properties pro= "test";
)

до следующего

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

Можно ли использовать однострочную команду типа sed или awk?

0
задан 16 March 2021 в 16:18

1 ответ

Если ваши функции разделены на абзацы одной или несколькими пустыми строками, как показано на рисунке, то вы можете использовать awk с пустым разделителем записей. В частности, с GNU awk:

$ gawk '
    BEGIN{RS=""} 
    /^function b/ {sub(/properties pro= "test"/,"properties pro= \"replace\"")}
    {printf "%s%s", $0, RT}
' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

function c(
properties pro= "test";
)

Вы можете использовать и не-GNU awk, но вам нужно будет установить фиксированный выходной разделитель записей ORS, поскольку RT разделитель является специфическим для GNU.

Perl обеспечивает аналогичный режим абзаца с помощью опции -00 .

С помощью функции sed можно использовать диапазон адресов регулярных выражений для ограничения области применения подстановки ex.

$ sed '/^function b/,/^)$/s/properties pro= "test"/properties pro= "replace"/' a.txt
function a(
line 1;
line 2;
line ...;
properties pro = "test";
)

function b(
line 1;
line 2;
line ...;
properties pro= "replace";
)

function c(
properties pro= "test";
)

Однако имейте в виду, что вещи, которые могут быть синтаксически нейтральными в вашем "языке" (такие как пустые строки в пределах функции), могут нарушить этот подход - по этой причине регулярные выражения часто являются плохим выбором для таких задач.

1
ответ дан 18 March 2021 в 23:25

Другие вопросы по тегам:

Похожие вопросы: