исключая первые и последние строки от sed / ЗАПУСКАЮТСЯ/,/END/

Рассмотрите вход:

=sec1=
some-line
some-other-line

foo
bar=baz

=sec2=
c=baz

Если я хочу обработать только =sec1 =, я могу, например, прокомментировать раздел:

sed -e '/=sec1=/,/=[a-z]*=/s:^:#:' < input

... хорошо, почти.

Это прокомментирует строки включая "=sec1 =" и "=sec2 =" строки, и результат будет чем-то как:

#=sec1=
#some-line
#some-other-line
#
#foo
#bar=baz
#
#=sec2=
c=baz

Мой вопрос: Что самый легкий путь состоит в том, чтобы исключить запуск, и строки конца от / ЗАПУСКАЮТСЯ/,/END/диапазон в sed?

Я знаю, что для многого улучшения случаев "s:::" когти может дать решение в этом конкретном случае, но я после универсального решения здесь.

В "Sed - Введение и Учебное руководство" записи Bruce Barnett: "Я покажу Вам позже, как ограничить команду до, но не включая строку, содержащую указанный шаблон". но я не смог найти, где он на самом деле показывает это.

В "ПОЛЕЗНЫХ КОРОТКИХ СЦЕНАРИЯХ ДЛЯ SED", Скомпилированного Eric Pement, я мог найти только содержащий пример:

# print section of file between two regular expressions (inclusive)
sed -n '/Iowa/,/Montana/p'             # case sensitive

44
задан Chen Levy 20 August 2012 в 03:48
поделиться

2 ответа

Это должно помочь:

sed -e '/=sec1=/,/=sec2=/ { /=sec1=/b; /=sec2=/b; s/^/#/ }' < input

Это соответствует между sec1 и sec2 включительно, а затем просто пропускает первую и последнюю строку с помощью команды b . Это оставляет желаемые строки между sec1 и sec2 (исключая), а команда s добавляет знак комментария.

К сожалению, вам действительно нужно повторять регулярные выражения для соответствия разделителям. Насколько я знаю, лучшего способа сделать это нет. По крайней мере, вы можете сохранить регулярные выражения в чистоте, даже если они используются дважды.

Это адаптировано из SED FAQ: Как мне адресовать все строки между RE1 и RE2, за исключением самих строк?

]
38
ответ дан 26 November 2019 в 22:15
поделиться

вы также можете использовать awk

awk '/sec1/{f=1;print;next}f && !/sec2/{ $0="#"$0}/sec2/{f=0}1' file
1
ответ дан 26 November 2019 в 22:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: