GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Sed On Osx Insert an einer bestimmten Zeile?

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+)


Linux
  1. Bearbeiten von Text auf der Kommandozeile mit sed

  2. Kann Sed Zeilenumbrüche ersetzen?

  3. Neue Zeilen mit fehlenden Werten einfügen (na)?

  4. Konvertieren Sie die Zeichenfolge in der Befehlszeile in Hexadezimal

  5. Was ist der richtige Weg, um Tabulatoren in sed einzufügen?

Verwendung des Linux-Befehls sed mit Beispielen

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

Wie füge ich einen Text am Anfang einer Datei ein?

sed zum Einfügen nur bei der ersten Übereinstimmung

Entfernt eine bestimmte Zeile aus der Bash-Verlaufsdatei

Mehrzeilige Sed ersetzen