Komenda Sed, która działa zarówno na MacOS (przynajmniej OS 10), jak i na Uniksie (tzn. Nie wymaga gnu sed jak Gilles (obecnie akceptowany)):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Działa to w bashu i być może także w innych powłokach, które znają styl cytowania oceny $ '\ n'. Wszystko może znajdować się w jednej linii i działać w starszych komendach / POSIX sed. Jeśli może być wiele wierszy pasujących do CLIENTSCRIPT = "foo" (lub odpowiednik) i chcesz dodać dodatkowy wiersz tylko za pierwszym razem, możesz go przerobić w następujący sposób:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(tworzy to pętlę po kodzie wstawiania wiersza, który po prostu przewija resztę pliku, nigdy nie wracając do pierwszej komendy sed).
Możesz zauważyć, że dodałem „^ *” do pasującego wzorca, na wypadek gdyby linia ta pojawiła się w komentarzu, powiedzmy lub była wcięta. Nie jest w 100% idealny, ale obejmuje niektóre inne sytuacje, które mogą być powszechne. Dostosuj zgodnie z wymaganiami ...
Te dwa rozwiązania również rozwiązują problem (ogólne rozwiązanie dodawania linii), że jeśli twoja nowa wstawiona linia zawiera nieokreślone ukośniki odwrotne lub znaki ampersand, zostaną one zinterpretowane przez sed i prawdopodobnie nie wyjdą tak samo, jak \n
jest np. \0
byłaby dopasowana pierwsza linia. Szczególnie przydatny, jeśli dodajesz wiersz pochodzący ze zmiennej, w którym inaczej musiałbyś uciec od wszystkiego, używając $ {var //} wcześniej, lub innej instrukcji sed itp.
To rozwiązanie jest nieco mniej nieporządne w skryptach (że cytowanie i \ n nie jest łatwe do odczytania), gdy nie chcesz umieszczać tekstu zastępczego polecenia na początku wiersza, jeśli powiedzmy, w funkcji z wcięciami. Skorzystałem z tego, że $ '\ n' jest oceniany przez powłokę do nowego wiersza, nie jest to zwykła wartość \ n "pojedynczego cudzysłowu.
Robi się wystarczająco długo, więc myślę, że perl / nawet awk może wygrać z powodu większej czytelności.