@ Ed Morton: Я тут з вами не згоден. Я виявив 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}'