Поиск нескольких строк, включая пустую строку в сценарии оболочки - PullRequest
0 голосов
/ 16 марта 2012

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

sed -n '1h; 1!H; ${ g; s/<Pattern1>\n<pattern2> //g p }' <file-name>

Например, чтобы найти шаблон John Doe

в файле test.txt, который содержит следующие записи:

Mary

John
Doe
Simon
Henry

Я бы использовал команду:

sed -n  '1h; 1!H; ${ g; s/John\nDoe //g p }' test.txt

Однако я не могу сделать этокоманда работает для шаблона, который имеет вторую строку как пустую, то есть использует символ ^ $.

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

sed -n  '1h; 1!H; ${ g; s/Mary\n^$ //g p }' test.txt

Есть мысли?

РЕДАКТИРОВАТЬ


Однако, если я сохраню несколько таких команд вфайл и выполнить их, затем первый поиск проходит нормально, однако при поиске последующих шаблонов я получаю пустой вывод из sed.

То есть, если я храню, sed -n '1h;! 1 H;$ {г;s / \ n // gp} 'sed -n' 1h;! 1 H;$ {г;s / \ n // gp} 'в файле, а затем выполните каждую строку в этом файле с помощью ключевого слова eval, затем первый sed заменяет первые многострочные шаблоны, т.е. pattern1, за которыми следует pattern2, однако он возвращаетпустой вывод, даже если файл содержит эти шаблоны.Любые подсказки?

Ответы [ 2 ]

2 голосов
/ 16 марта 2012

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

sed '$!N;s/John\nDoe//;P;D' file
Mary


Simon
Henry
sed '$!N;s/Mary\n$//;P;D' file

John
Doe
Simon
Henry

N.B. ^ относится к началу строки , а не к началу строки (если только в GNU sed вы не используете флаг m). Аналогично $ означает конец строки.

EDIT:

Две вышеупомянутые команды могут быть объединены:

sed '$!N;s/John\nDoe//;s/Mary\n$//;P;D' file


Simon
Henry
1 голос
/ 16 марта 2012

Это работает для меня с вашим входным файлом:

sed -n  '1h; 1!H; ${ g; s/Mary\n\n/\n/g p }'

Объяснение:

Mary\n\n                # Mary with two consecutive newlines, the first one is automatically added by
                        # the 'H' command, and the next one means the empty line, asumming it has no
                        # spaces.
\n                      # Substitute it with a blank line.
...