Ich benutze „sed“ also schon seit einiger Zeit unter Linux, hatte aber ein paar Schwierigkeiten beim Versuch, es unter OSX zu verwenden, da „POSIX sed“ und „GNU sed“ so viele kleine Unterschiede aufweisen. Derzeit kämpfe ich damit, wie ich eine Textzeile nach einer bestimmten Zeilennummer einfügen kann. (in diesem Fall Zeile 4)
Unter Linux würde ich so etwas tun:
sed --in-place "4 a\ mode '0755'" file.txt
Also habe ich unter OSX Folgendes versucht:
sed -i "" "4 a\ mode '0755'" file.txt
Dies gibt mir jedoch immer wieder den Fehler „zusätzliche Zeichen nach \ am Ende eines Befehls“. Irgendwelche Ideen, was hier falsch ist? Habe ich einen Tippfehler? Oder verstehe ich einen weiteren Unterschied zwischen den Versionen von sed nicht?
Akzeptierte Antwort:
Genau genommen die POSIX-Spezifikation für sed
erfordert einen Zeilenumbruch nach a\
:
[1addr]a\ text
Text wie zuvor beschrieben in die Standardausgabe schreiben.
Das macht das Schreiben von Einzeilern etwas mühsam, was wahrscheinlich der Grund für die folgende GNU-Erweiterung des a
ist , i
, und c
Befehle:
Als GNU-Erweiterung, wenn zwischen a
und der Zeilenumbruch dort ist anders als ein Leerzeichen-\
Sequenz, dann der Text dieser Zeile, beginnend mit dem ersten Nicht-Leerzeichen nach dem a
, wird als erste Zeile des Textes genommen Block. (Dies ermöglicht eine Vereinfachung beim Skripten eines einzeiligen Hinzufügens.) Diese Erweiterung funktioniert auch mit dem i
und c
Befehle.
Damit Sie mit Ihrem sed
tragbar sind Syntax müssen Sie nach dem a\
einen Zeilenumbruch einfügen irgendwie. Am einfachsten ist es, einfach einen Zeilenumbruch in Anführungszeichen einzufügen:
$ sed -e 'a\
> text'
(wobei $
und >
sind Shell-Eingabeaufforderungen). Wenn Sie das mühsam finden, bash
[1] hat den $' '
Zitiersyntax zum Einfügen von Escapezeichen im C-Stil, verwenden Sie also einfach
sed -e 'a\'$'\n''text'
[1] und mksh (r39b+) und einige Nicht-Bash-Bourne-Shells (z. B. /bin/sh in FreeBSD 9+)