Правильный инструмент для этой работы - awk
, а не sed
. Чтобы сделать то же самое, что и ваш текущий sed
:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==1) {
gsub("before","after");
print;
} else {
print
}
}'
даст вам:
before
begin
after
end
before
Если вы измените смысл оператора if
, управляющего gsub
, вы получите то, что хотите:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==0) {
gsub("before","after");
print;
} else {
print
}
}'
даст вам:
after
begin
before
end
after