LINUX.ORG.RU

Sed, awk -мультистроки

 ,


0

2

Здравствуй врач,

В файле есть следующие блоки:

=======02=======

abc1234abc
abc1234abc
abc1234abc
=======

=======03=======

qwerty
=======

=======abc=======

abc1234abc
abc1234abc
abc1234abc
=======

Каждый блок начинается и заканчивается «=», нужно удалить блок в котором всегда строка «qwerty». Логика как я понимаю должна быть примерно следующая, если ^= qwerty =$ то удаляем. Покажите, пожалуйста, как работать с блоками в sed или awk. При помощи grep всеравно такое не сделать, ибо он построчно читает файл.


Например, так

$ cat test
=======02=======

abc1234abc
abc1234abc
abc1234abc
=======

=======03=======
lorem ipsum
qwerty
foo bar
=======

=======abc=======

abc1234abc
abc1234abc
abc1234abc
=======
$ sed -e '/^=/ { :a; N; /\n=/!ba }; /qwerty/ d' < test
=======02=======

abc1234abc
abc1234abc
abc1234abc
=======


=======abc=======

abc1234abc
abc1234abc
abc1234abc
=======
thriller ★★ ()
Ответ на: Re: Например, так от hama

BSD sed до сих пор не понимает точку с запятой; вам остаётся только разделить этот скрипт на кучу строк и написать его в файл с #!/bin/sed.

thriller ★★ ()
Ответ на: Re: Например, так от hama

Он не какашечный, какашечный ты! Это версия BSD, которая не обязана понимать говняные гнушные параметры

mystery ★★ ()
Ответ на: комментарий от thriller

BSD sed до сих пор не понимает точку с запятой

Вообще-то, неправда. Просто на самом деле употребление её после метки и перехода - «расширение» GNU (так же как и отсутствие перед «}»).
man 1p sed:

Command verbs other than {, a, b, c, i, r, t, w, :, and # can  be  followed          
by  a  <semicolon>,  optional <blank> characters, and another command verb.          
However, when the s command verb is used with the w flag, following it with          
another command in this manner produces undefined results.

и написать его в файл

В данном случае непосредственно в скрипте можно написать так:

  sed '/^=/ {
         :a
         N ; /\n=/! ba
       }
       /qwerty/ d' ./test

ABW ★★★★★ ()
Ответ на: комментарий от ABW

Можно и через множественный -e извернуться, и даже $'\n', но для удобства правки что-нибудь многострочное я стараюсь сразу переписывать в скрипт-файл, пусть даже и одноразовый. А за уточнение по точке с запятой спасибо.

thriller ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.