Команда Sed, которая работает как на MacOS (по крайней мере, на OS 10), так и на Unix (т.е. не требует gnu sed, как это делает Gilles (в настоящее время принятая)):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Это работает в bash и, возможно, в других оболочках, которые знают стиль цитаты оценки $ '\ n'. Все может быть в одной строке и работать в старых командах / POSIX sed. Если может быть несколько строк, соответствующих CLIENTSCRIPT = "foo" (или вашему аналогу), и вы хотите добавить только дополнительную строку в первый раз, вы можете переработать ее следующим образом:
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
будет соответствовать первой строке. Особенно удобно, если вы добавляете строку, которая приходит из переменной, в противном случае вам пришлось бы сначала экранировать все, используя $ {var //} раньше, или другой оператор sed и т. Д.
Это решение немного менее запутанно в сценариях (хотя цитирование и \ n нелегко читать), когда вы не хотите помещать текст замены для команды a в начале строки, если, скажем, в функции с отступом линий. Я воспользовался тем, что оболочка $ '\ n' вычисляется до новой строки, а не в обычных одинарных кавычках '\ n'.
Это становится достаточно длинным, хотя я думаю, что perl / даже awk могут выиграть из-за большей читабельности.