Вставить строку после первого совпадения с помощью sed

По какой-то причине я не могу найти прямой ответ на этот вопрос, и на данный момент я нахожусь в некотором роде. Как бы я хотел вставить строку выбора текста после первой строки, соответствующей определенной строке, с помощью команды sed. У меня есть...

CLIENTSCRIPT="foo"
CLIENTFILE="bar"

И я хочу вставить строку после строки CLIENTSCRIPT=, которая приведет к...

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

Ответ 1

Попробуйте сделать это:

sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

если вы хотите заменить на месте, используйте

sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file

Выход

CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"

Doc

  • см. sed doc и выполните поиск \a (добавьте)

Ответ 2

Обратите внимание на стандартный синтаксис sed (как в POSIX, поддерживаемый всеми соответствующими реализациями sed вокруг (GNU, OS/X, BSD, Solaris...)):

sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file

Параметр -i для редактирования на месте также является расширением GNU, для него поддерживаются некоторые другие реализации (например, FreeBSD) -i ''.

В качестве альтернативы, для переносимости вы можете вместо этого использовать perl:

perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file

Или вы можете использовать ed или ex:

printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file

Ответ 3

A-совместимый однострочный POSIX:

sed '/CLIENTSCRIPT="foo"/s/.*/&\nCLIENTSCRIPT2="hello"/' file

Ответ 4

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

Script Загрузить: kinglazy-autoinsert.sh

Применение:

kinglazy-autoinsert.sh(list_file) (pattern_file)

Объяснение параметров:

list_file = Это файл, который содержит абсолютный путь к списку файлов, которые вы хотите отредактировать

pattern_file = Это файл, в котором вы указываете шаблон (в первом столбце), под которым вы хотите добавить новый текст. Новый текст для добавления под шаблоном указан во втором столбце. И это об этом!

Этот script экономит время и помогает выполнить работу с минимальными усилиями.

Зависимости: Нет

Ответ 5

У меня была аналогичная задача, и я не смог заставить вышеупомянутое решение perl работать.

Вот мое решение:

perl -i -pe "BEGIN{undef $/;} s/^\[mysqld\]$/[mysqld]\n\ncollation-server = utf8_unicode_ci\n/sgm" /etc/mysql/my.cnf

Объяснение:

Использует регулярное выражение для поиска строки в файле /etc/mysql/my.cnf, содержащем только [mysqld] и заменяя его

[mysqld] collation-server = utf8_unicode_ci

эффективно добавляет строку collation-server = utf8_unicode_ci после строки, содержащей [mysqld].