У меня есть файл, называемый 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?
Если ваши функции разделены на абзацы одной или несколькими пустыми строками, как показано на рисунке, то вы можете использовать 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";
)
Однако имейте в виду, что вещи, которые могут быть синтаксически нейтральными в вашем "языке" (такие как пустые строки в пределах функции), могут нарушить этот подход - по этой причине регулярные выражения часто являются плохим выбором для таких задач.