GNU sed --posix und Zeilenumbruchzeichen in der Ersetzungszeichenfolge

GNU sed --posix und Zeilenumbruchzeichen in der Ersetzungszeichenfolge

In der POSIX- sedSpezifikationdiese Aussageist zu finden (meine Hervorhebung):

Die Escape-Sequenz „\n“ muss mit einem im Musterbereich eingebetteten <newline> übereinstimmen.Ein wörtliches <newline> darf nicht verwendet werdenim BRE einer Kontextadresse oderin der Ersatzfunktion.

Der folgende GNU- sedBefehl mit --posixFlag widerspricht dieser Spezifikation, da in der Ersetzungsfunktion eine neue Zeile verwendet wird.

$ printf '1X2' | sed --posix 's|X|\n|'
1
2

Warum wurde also sedeine neue Zeile eingefügt, anstatt eine Fehlermeldung auszugeben?

Antwort1

„Ein wörtliches <newline> darf nicht verwendet werden“, In Ihrem Beispiel wird kein wörtliches Newline verwendet. Daher ist dieser Teil des Standards nicht relevant.

\nIstnichtein wörtlicher Zeilenumbruch.

Antwort2

Das --posixFlag macht GNU sedPOSIX-kompatibel.

POSIX lässt das Verhalten s/x/\n/unspezifiziert:

Die Bedeutung eines nicht maskierten <Backslash>, auf den unmittelbar ein anderes Zeichen als „&“, <Backslash>, eine Ziffer, <Newline> oder das für diesen Befehl verwendete Trennzeichen folgt, ist nicht festgelegt.

Das Ersetzen xdurch n, durch \n, durch Newline, das Melden eines Fehlers und das Neustarten Ihres Computers sind also alles konforme Verhaltensweisen. Es gibt keinen Grund, warum GNU sedsein Verhalten hier ändern sollte.

Eine konformeAnwendung(also in diesem Fall Skript) dürfen \ndort nicht verwendet werden, darum geht es in dem von Ihnen zitierten Text.

Anders verhält es sich dort, wo POSIX verlangt, sowohl als auch durch s/[\t]/x/gzu ersetzen . Dort werden Sie sehen, dass sich das Verhalten von GNU mit ändert . Für ist die POSIX-Spezifikation tatsächlich mehrdeutig. GNU ändert sein Verhalten mit , sodass es und durch ersetzt , aber es ist nicht so klar, ob das nötig ist oder nicht.\txsed--posixs/[\n]/x/gsed--posix\nx

Antwort3

Der Standard legt fest, dass in derSuchmuster(BRE, Basic Regular Expression, in POSIX-Sprache) kein expliziter Zeilenumbruch verwendet werden kann und dass ein Zeilenumbruch durch '\n' dargestellt wird; und er kann nicht verwendet werden inErsatzentweder.

Ihr Suchmuster enthält keine Zeilenumbrüche, weder explizit noch durch '\n' dargestellt. Sie haben ein '\n' im Ersetzungstext. Oben steht nicht, wie ein Zeilenumbruch im Ersetzungstext dargestellt werden soll (falls überhaupt). GNU sed interpretiert das Vorherige so, dass das Ersetzen durch '\n' die Einführung eines Zeilenumbruchs bedeutet. Sinnvoll.

verwandte Informationen