@ Эд Мортон: Я с вами не согласен. Я нашел sed
очень полезным и простым (как только вы разберетесь с концепцией шаблона и буферов хранения) придумать элегантный способ выполнения многострочного поиска.
Например, возьмем текстовый файл с именами хостов и некоторой информацией о каждом хосте с большим количеством мусора между ними, который меня не волнует.
Host: foo1
some junk, doesnt matter
some junk, doesnt matter
Info: about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Info: a second line about foo1 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Host: foo2
some junk, doesnt matter
Info: about foo2 that I really care about!!
some junk, doesnt matter
some junk, doesnt matter
Для меня сценарий awk, который просто получает строки с именем хоста и соответствующей info
строкой, занимает немного больше, чем то, что я могу сделать с помощью sed:
sed -n '/Host:/{h}; /Info/{x;p;x;p;}' myfile.txt
вывод выглядит так:
Host: foo1
Info: about foo1 that I really care about!!
Host: foo1
Info: a second line about foo1 that I really care about!!
Host: foo2
Info: about foo2 that I really care about!!
(Обратите внимание, что Host: foo1
на выходе появляется дважды.)
Пояснение:
-n
отключает вывод, если явно не напечатан
- первое совпадение, находит и помещает
Host:
строку в буфер удержания (h)
- второе совпадение, находит следующую строку Info :, но сначала меняет (x) текущую строку в буфере шаблонов на буфер хранения и печатает (p)
Host:
строку, затем повторно меняет (x) и печатает (p) строку Info :.
Да, это упрощенный пример, но я подозреваю, что это обычная проблема, с которой быстро справился простой однострочник sed. Для гораздо более сложных задач, таких как те, в которых вы не можете полагаться на заданную предсказуемую последовательность, awk может лучше подойти.
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'