Вставить строку после первого совпадения с помощью 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]
.