Используя sed и / или awk, как можно выполнить подкачку sed для всего текста в файле, пока я не увижу строку, соответствующую регулярному выражению? - PullRequest
2 голосов
/ 26 марта 2010

Как я могу сделать подстановку регулярного выражения sed для всего текста, который предшествует строке, соответствующей регулярному выражению.

например. Как я могу сделать своп, как это

s/foo/bar/g

для всего текста, который предшествует первой точке, которой соответствует это регулярное выражение:

m/baz/

Я не хочу использовать положительный / отрицательный взгляд вперед / назад в моем регулярном выражении sed, потому что это действительно дорогие операции с большими файлами.

Ответы [ 4 ]

4 голосов
/ 26 марта 2010

Этот вариант ответа Джефроми должен помочь избежать касания строки, на которой появляется "baz", как упоминалось в комментарии Джонатана.

sed '1,/baz/{/baz/!s/foo/bar/g}'
4 голосов
/ 26 марта 2010

Если вы имеете в виду, что вы хотите выполнить замену в каждой строке , предшествующей данному совпадению, это ваш ответ:

Подстановка принимает необязательный диапазон адресов; Вы можете использовать как цифры, так и шаблоны. В этом случае начните со строки 1 и продолжайте до своего паттерна:

sed '1,/baz/s/foo/bar/g'

В awk:

awk '
/baz/ { done = 1 }
{
    if (!done) {
        gsub(/foo/, "bar")
    }
    print
}'

(он достаточно короткий, чтобы пропустить разрывы строк, но они делают его читаемым)

3 голосов
/ 26 марта 2010
$ cat file
123 abc 01
456 foo 02 bar
789 ghi
baz
blah1
blah2
foo bar

$ awk -vRS="baz" 'NR==1{gsub("foo","bar")}1' ORS="baz" file
123 abc 01
456 bar 02 bar
789 ghi
baz
blah1
blah2
foo bar
baz

используйте разделитель записей «baz», тогда первой записью будет запись, которую вы хотите изменить «foo» на «bar».

с sed, вариант решения Денни, чтобы позаботиться о "баз" в первой строке

sed '0,/baz/{/baz/!s/foo/bar/g}' file
1 голос
/ 24 февраля 2012

Это может работать для вас:

awk '/baz/{p=1};!p{gsub(/foo/,"bar")};1' file

или это:

sed '/baz/,$!s/foo/bar/g' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...