Sed-Befehl, der unter MacOS (mindestens OS 10) und Unix gleichermaßen funktioniert (dh erfordert keine Gnu-Sed wie Gilles (derzeit akzeptiert)):
sed -e '/CLIENTSCRIPT="foo"/a\'$'\n''CLIENTSCRIPT2="hello"' file
Dies funktioniert in Bash und möglicherweise auch in anderen Shells, die den $ '\ n' Bewertungszitatstil kennen. Alles kann in einer Zeile stehen und in älteren / POSIX sed-Befehlen funktionieren. Wenn möglicherweise mehrere Zeilen mit CLIENTSCRIPT = "foo" (oder Ihrem Äquivalent) übereinstimmen und Sie die zusätzliche Zeile nur beim ersten Mal hinzufügen möchten, können Sie sie wie folgt überarbeiten:
sed -e '/^ *CLIENTSCRIPT="foo"/b ins' -e b -e ':ins' -e 'a\'$'\n''CLIENTSCRIPT2="hello"' -e ': done' -e 'n;b done' file
(Dies erzeugt eine Schleife nach dem Zeileneinfügungscode, die nur den Rest der Datei durchläuft und nie wieder zum ersten sed-Befehl zurückkehrt.)
Möglicherweise stellen Sie fest, dass ich dem übereinstimmenden Muster ein '^ *' hinzugefügt habe, falls diese Zeile beispielsweise in einem Kommentar angezeigt oder eingerückt wird. Es ist nicht 100% perfekt, deckt aber einige andere Situationen ab, die wahrscheinlich häufig sind. Nach Bedarf anpassen ...
Diese beiden Lösungen umgehen auch das Problem (für die generische Lösung zum Hinzufügen einer Zeile), dass, wenn Ihre neu eingefügte Zeile nicht gekapselte Backslashes oder kaufmännisches Und enthält, diese von sed interpretiert werden und wahrscheinlich nicht gleich herauskommen, genau wie die \n
is - z.\0
wäre die erste übereinstimmende Zeile. Besonders praktisch, wenn Sie eine Zeile hinzufügen, die aus einer Variablen stammt, in der Sie sonst alles zuerst mit $ {var //} oder einer anderen sed-Anweisung usw. maskieren müssten.
Diese Lösung ist in Skripten etwas weniger chaotisch (das Zitieren und \ n ist jedoch nicht einfach zu lesen), wenn Sie den Ersatztext für den Befehl a nicht am Anfang einer Zeile einfügen möchten, wenn Sie beispielsweise in einer Funktion stehen mit eingerückten Linien. Ich habe ausgenutzt, dass $ '\ n' von der Shell als Zeilenumbruch ausgewertet wird, nicht in regulären '\ n' Werten in einfachen Anführungszeichen.
Es wird jedoch lang genug, dass ich denke, Perl / sogar Awk könnte gewinnen, weil es besser lesbar ist.