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

Unterschiede zwischen Sed auf Mac Osx und anderen „Standard“-Sed?

Ich habe einige Probleme bei der Verwendung einer auf dieser Website bereitgestellten Antwort auf diese Frage zu einem sed-Befehl, um eine Leerzeile durch zwei andere Inhaltszeilen zu ersetzen, und es wurde angezeigt, wenn der sed-Befehl unter Mac OS (10.6.7 für mich ) ist anders. Ich glaube nicht, dass es so ist, aber ich habe mich gefragt, ob andere auf dieser Website anderer Meinung sind.

Akzeptierte Antwort:

Das Verhalten von Shell-Utilities unterscheidet sich geringfügig zwischen Unix-Varianten. Es gibt viele Unix-Varianten mit einer komplexen Geschichte. Es gibt Standardisierungsbemühungen wie den POSIX-Standard und seine Obermenge, die Single-UNIX-Spezifikation. Die meisten Systeme implementieren heutzutage POSIX:2001, auch bekannt als Single UNIX Specification Version 3, mit geringfügigen Abweichungen und vielen Erweiterungen. Die Single Unix-Spezifikation ist kein Tutorial, aber Version 3 ist lesbar, wenn Sie bereits eine Vorstellung davon haben, was ein Befehl tut. Sie können es konsultieren, um zu erfahren, ob eine Funktion Standard oder eine Erweiterung eines bestimmten Systems ist.

Die Mehrheit der Unix-Benutzer verwendet Linux und hat keine andere Variante verwendet. Linux wird mit GNU-Dienstprogrammen geliefert, die oft viele Erweiterungen des Standards haben. Sie werden also ziemlich viel Code finden, der unter Linux funktioniert, aber nicht auf anderen Unices, weil er auf diese Erweiterungen angewiesen ist.

In Bezug auf sed konsultieren Sie die sed Single Unix-Spezifikation für das Minimum, das jedes System unterstützen soll, die Manpage auf Ihrem System für das, was Ihre Implementierung unterstützt, und das GNU sed-Handbuch für das, was die meisten Leute da draußen verwenden.

Eine der nicht standardmäßigen Erweiterungen in GNU sed unterstützt mehrere Befehle, die zusammen ausgeführt werden. Zum Beispiel gibt dieses GNU-Programm sed alle Zeilen aus, die ein a enthalten , ändert aber b in c zuerst:

sed -ne '/a/ {s/b/c/g; p}'

{ und } sind eigentlich separate Befehle, also müssen Sie sie für vollständige Portabilität entweder in separaten Zeilen (in einer Datei) oder in separaten -e angeben Argumente (auf der Kommandozeile). Das Fehlen eines Befehlstrennzeichens nach { und die Verwendung von ; als Befehlstrennzeichen sind gängige Erweiterungen. Das Fehlen eines Befehlstrennzeichens vor } ist eine weniger verbreitete Erweiterung. Das ist standardkonform:

sed -n -e '/a/ {' -e 's/b/c/g' -e p -e '}'

Dies ist kein Standard, aber allgemein akzeptiert:

sed -ne '/a/ { s/b/c/g; p; }'

Eine weitere nicht standardmäßige, aber übliche Erweiterung ist die Verwendung von \n um einen Zeilenumbruch in einem s zu bedeuten Ersatztext (die Verwendung in einem Regexp ist Standard). Die portable Methode besteht darin, Backslash-Newline in das Sed-Skript aufzunehmen. Eine weitere gebräuchliche Erweiterung ist \+ , \? und \| in regulären Ausdrücken bedeutet eins oder mehrere, höchstens eins und Alternation; portable grundlegende reguläre Ausdrücke haben nichts davon. Beispielsweise ist der erste Befehl eine nicht portierbare Methode, um zusammenhängende Leerzeichenfolgen durch einen Zeilenumbruch zu ersetzen; der zweite Befehl ist ein standardkonformes Äquivalent.

sed -e 's/ \+/\n/'
sed -e 's/  */\
/'

Linux
  1. Wie kann man einige Unterschiede im diff-Befehl ignorieren?

  2. Linux-Unterschied zwischen sudo crontab -e und nur crontab -e

  3. Was ist der Unterschied zwischen &> und >&in bash?

  4. Binäre Kompatibilität zwischen Mac OS X und Linux

  5. Unterschied zwischen 'man ls' und 'ls --help'?

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Vim vs. Vi – Ähnlichkeiten und Unterschiede zwischen VIM und VI?

Unterschiede zwischen nobootwait und nofail in Linux-Dateisystemen

So teilen Sie Dateien zwischen Ubuntu und Mac OS X

Unterschied zwischen '{}' und {} im Find-Befehl?

Unterschied zwischen cp -r und cp -R (Kopierbefehl)