Изменить строки, которые соответствуют шаблону между разделителями, используя awk - PullRequest
3 голосов
/ 20 мая 2011

У меня есть входной файл что-то вроде этого:

some line
some other line
another line
start_delimiter
  interesting stuff
  more interesting stuff
  even more interesting stuff
end_delimiter
possibly more stuff

Я хочу манипулировать строками между start_delimiter и end_delimiter, которые соответствуют шаблону регулярных выражений, и записывать результаты во входной файл. Например, добавьте «//» в начало строк, содержащих слово «more» (если эти строки находятся между разделителями):

some line
some other line
another line
start_delimiter
  interesting stuff
  //more interesting stuff
  //even more interesting stuff
end_delimiter
possibly more stuff

Я могу получить раздел текста между разделителями следующим образом:

awk '/start_delimiter/,/end_delimiter/' inputfile

Если я передам это другому awk, я могу изменить интересующие меня строки:

awk '/more/ {sub(/^/,"//")}1'

В чем я не уверен, так это в том, как вернуться и заменить раздел с разделителями новым содержимым. Есть идеи? Бонусные баллы за однострочник.

Ответы [ 3 ]

9 голосов
/ 20 мая 2011
/start_delimiter/ {inblock=1}
/end_delimiter/ {inblock=0;}
{ if (inblock==1 && (/more/)) { print "//" $0 } else print $0}
6 голосов
/ 20 мая 2011

А для фанатов одного лайнера:

awk '/^(start_delim|end_delim)/{f=f?0:1}f&&/more/{$0="//" $0}1' file

Добавлено начало строки ^ якоря, чтобы избежать путаницы, если разделитель блоков встроен в середину строки.

1 голос
/ 20 мая 2011

вам нужно что-то вроде

awk '/start_delimiter/,/end_delimiter/{
  if ($0 ~ /^more/ ) { print "//" $0 } 
  else print $0
}
!/start_delimiter/,/end_delimiter/ print $0' inputfile

2-й шаблон диапазона - это печать других строк вне диапазона (заданного начальным '!') (У меня не было способа проверить это прямо сейчас, поэтому попробуйте переместить '!' Вокруг если это не работает так

Надеюсь, это поможет.

...