Команда Sed, яка працює на MacOS (принаймні, ОС 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 непросте для читання), коли ви не хочете ставити текст заміни для команди на початку рядка, якщо, скажімо, у функції з відступними лініями. Я скористався тим, що $ '\ n' обчислюється оболонкою до нового рядка, а не в регулярних значеннях \ \ n 'з одним котируванням.
Його отримання стає досить довгим, хоча я думаю, що perl / even awk може виграти через те, що він читає більше.