Почему я могу'т показаться, чтобы найти простой ответ на этот и я'м на немного хватает времени на данный момент. Как бы я идти о добавлении строки выбор текста после первой строки, соответствующие определенному строку, используя команду СЭД
. У меня есть ...
CLIENTSCRIPT="foo"
CLIENTFILE="bar"
И я хочу, чтобы вставить строку после строки CLIENTSCRIPT=` прив ...
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
Попробуйте сделать это с помощью GNU СЕПГ:
sed '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
если вы хотите заменить тюнинг-place_, использовать
sed -i '/CLIENTSCRIPT="foo"/a CLIENTSCRIPT2="hello"' file
<Н2>выход</Н2>
CLIENTSCRIPT="foo"
CLIENTSCRIPT2="hello"
CLIENTFILE="bar"
<Н2>док</Н2>
\а
(добавить)Примечание синтаксис стандарт СЭД
(как в POSIX, так что поддерживается всеми соответствующей `внедрений СЭД по (Лицензия GNU, ОС/Х, БСД, Солярис...)):
sed '/CLIENTSCRIPT=/a\
CLIENTSCRIPT2="hello"' file
Или на одной строке:
sed -e '/CLIENTSCRIPT=/a\' -e 'CLIENTSCRIPT2="hello"' file
(- е'xpressions (и содержание-Ф'iles) соединяются с новой строки, чтобы сделать СЕПГ сценарий СЭД
интерпретирует).
Опции -I
для редактирования также расширение GNU, некоторых других реализациях (типа FreeBSD's) поддержка -я ''
для этого.
Кроме того, для мобильности, вы можете использовать Перл
вместо:
perl -pi -e '$_ .= qq(CLIENTSCRIPT2="hello"\n) if /CLIENTSCRIPT=/' file
Или вы могли бы использовать Эд
или экс
:
printf '%s\n' /CLIENTSCRIPT=/a 'CLIENTSCRIPT2="hello"' . w q | ex -s file
В POSIX-совместимой, используя команду ы
:
sed '/CLIENTSCRIPT="foo"/s/.*/&\
CLIENTSCRIPT2="hello"/' file
Команды sed, которая работает на macOS (по крайней мере, ОС 10) и UNIX-подобные (т. е. не't, требуют наличия лицензии GNU СЕПГ, как Жиль' (общепринятой) один делает):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Это работает в bash и, возможно, другие снаряды тоже, что знать $'\П' оценка цитировать стиле. Все может быть на одной линии и работают в старые/с POSIX команды sed. Если там может быть несколько строк, соответствующих CLIENTSCRIPT=на"фу" и (или свой эквивалент) и вы хотите только добавить дополнительные строки в первый раз, вы можете доработать его следующим образом:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(это создает петлю после кода вставки строки, которая просто перебирает оставшейся части файла, никогда не вернуться снова к первой команде sed).
Вы могли заметить, я добавил '^ *' к шаблону, в случае, если линия появляется в комментарии, скажем, или проминается. Его не 100% совершенным, но охватывает некоторых других ситуациях может быть общим. Отрегулируйте, как требуется...
Оба этих пути обойти эту проблему (для универсального решения для добавления линии), что если новая добавленная строка содержит неэкранированные символы амперсанда или они будут интерпретированы по sed и, скорее всего, не получится такой же, как и \N
является - например. \0
станет первой линии совпадают. Особенно удобно, если вы'вновь добавив строку, которая приходит из переменной, где вы'd в противном случае придется бежать сначала все через ${ВАР//} раньше, или другая инструкция СЭД и т. д.
Данное решение является немного менее грязный в скриптах (что цитируешь и \N не читается легко, хотя), когда вы Don'т хотите поставить Замена текста команды в начале строки, если, скажем, в функции, с отступом линии. Я'вэ воспользовались этим $'\П' оценивается в строку оболочкой, его не в обычном '\П' один-значения, заключенные в кавычки.
Ее становится достаточно долго, хотя, что я думаю на Perl/даже на awk может выиграть за счет более читабельным.
У меня была похожая задача, и не смог получить выше решение Perl для работы.
Вот мое решение:
перл-я -ЧП "и начать{фдоон $/;} ы/^\[тузды\]$/[тузды]\Н\ncollation-сервер = utf8_unicode_ci\Н/Стройгазмонтаж" в файле /etc/mysql в/мой.КНФ
Объяснение:
Использует регулярное выражение для поиска строки в файле /etc/mysql в/мой.CNF файл, который содержит только `[тузды] и заменил его
[тузды] сортировки-сервер = utf8_unicode_ci
эффективно добавление сортировки-сервер = utf8_unicode_ci
строку после строки, содержащей [тузды]
.
Из awk вариант :
awk '1;/CLIENTSCRIPT=/{print "CLIENTSCRIPT2=\"hello\""}' file
Может быть, немного поздно, чтобы дать ответ на этот, но я нашел некоторые из вышеуказанных решений немного громоздким.
Я пробовал простой заменой строки в СЭД и он работал:
sed 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
&ампер; знак отражает соответствующую строку, а затем добавить \N и новой линии.
Как уже упоминалось, если вы хотите сделать это на месте:
sed -i 's/CLIENTSCRIPT="foo"/&\nCLIENTSCRIPT2="hello"/' file
Другое дело. Вы можете сравнить с помощью выражения:
sed -i 's/CLIENTSCRIPT=.*/&\nCLIENTSCRIPT2="hello"/' file
Надеюсь, что это помогает кто-то