Сед из пары слов - PullRequest
       14

Сед из пары слов

1 голос
/ 09 августа 2009

Можно использовать следующую команду, чтобы заменить слово «до» словом «после», где «до» встречается между парой слов «начало» и «конец»:

sed '/ begin /, / end / {s / before / after / g}'

Я ищу способ заменить «до» на «после», только если они не встречаются внутри пары «начало» и «конец».

Ответы [ 3 ]

1 голос
/ 09 августа 2009

Инверсия почти тривиальна:

sed '/begin/,/end/ !s/before/after/g'

Имейте в виду, что с учетом следующего ввода

begin before end
before
end
before
begin
before end
before
end
before

Ваш оригинальный скрипт выдает:

begin after end
after
end
before
begin
after end
before
end
before

Обратите внимание, что конец в той же строке, что и начало, не отменяет подстановку. (И если вы используете «до» после «начала», «до» все еще заменяется на «после».)

0 голосов
/ 09 августа 2009
awk '/begin/{f=1}/end/{f=0}!f{ gsub("before","after")}1' file
0 голосов
/ 09 августа 2009

Правильный инструмент для этой работы - 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...