Многолинейный вариант Sed? - PullRequest
       20

Многолинейный вариант Sed?

0 голосов
/ 28 сентября 2010

Я хочу удалить весь текст между (и включая) двумя строками во всех файлах в каталоге.Например, файлы выглядят примерно так:

flag
bla bla bal
bla bla bla
endflag

etc..

Вот что я делаю с sed:

sed -i "s:flag.*endflag::m" *

Однако опция 'm' не является частьюСЕПГ.Все остальные потоки переполнения стека в этой теме прибегают к использованию perl, awk или оболочки sed для достижения этой цели.Разве нельзя сказать, чтобы sed соответствовал символам новой строки?

Ответы [ 3 ]

3 голосов
/ 28 сентября 2010

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

sed -i '/flag/,/endflag/d' *
2 голосов
/ 28 сентября 2010

Чтобы использовать альтернативные разделители для спецификаторов диапазона в sed, вы должны экранировать первый:

sed -i '\:<form:,\:</form>:d' *.aspx *.htm *.html
1 голос
/ 28 сентября 2010

Сначала вы должны скопировать текст в буфер хранения, а затем сопоставить \ n, как и любой другой символ. Обычно в буфере удержания есть только одна строка, поэтому \ n никогда не является частью анализируемой строки. Следующий вызов сначала копирует первую строку в буфер удержания (1h), затем добавляет все последующие строки в буфер удержания (1! H) и после добавления последней строки ($) выполняет замену (s /).

sed -n '1h;1!H;${;g;s/flag.*endflag\n//g;p;}' foo.txt
...