🐧 Вставка текста над/под совпадением с помощью sed

Как вставить текст над или после совпадением на Linux

by itisgood

Вы можете использовать sed для замены или удаления строк, но он также может вставлять текст в определенные места.

Вот несколько примеров.

Вставка строки перед совпадением

Обратите внимание на /i (insert) в команде sed:

$ echo "hello world" | sed "/^hello/i inserted before"
inserted before
hello world

Добавление строки после совпадения

Обратите внимание на /a (append) в команде sed:

$ echo "hello world" | sed "/^hello/a appended after"
hello world
appended after

Предоставление или добавление дополнительных новых строк с помощью \n:

Если вы используете версию sed для GNU, она работает иначе, чем версия sed для OpenBSD (macOS), из-за того, как она поддерживает \n.

Если вы хотите сделать так, чтобы это работало с обеими версиями, это можно сделать, но давайте сначала рассмотрим общий случай с версией GNU.

$ echo "hello world" | sed "/^hello/i inserted before with extra line breaks\n\n"
inserted before with extra line breaks


hello world
$ echo "hello world" | sed "/^hello/a \\\n\nappended after with extra line breaks"
hello world


appended after with extra line breaks

Во втором примере мы дважды переводим первый перенос строки.

Без этого я обнаружил, что sed возвращает буквально n только с одним из переносов строки.

Также сработало использование \ \n\n.

Я не совсем понимаю, почему мы должны делать то или другое, но это рабочее решение.

Чтобы заставить оба примера работать с версиями sed для GNU и OpenBSD, вы можете заменить \n на буквальную новую строку, например, так:

# Using single quotes instead of double is important here, so is using \ to
# break the script into multiple lines.
echo "hello world" | sed '/^hello/i inserted before with extra line breaks\
\
'

см. также:

Loading

You may also like

Leave a Comment