Die Flags arbeiten entgegengesetzt zu dem, was Sie erwarten. Die Dokumentation von /e
ist für die Aufzeichnung:
Mit diesem Befehl kann eine Eingabe von einem Shell-Befehl in den Musterraum geleitet werden. Wenn eine Ersetzung vorgenommen wurde, wird der im Musterraum gefundene Befehl ausgeführt und der Musterraum durch seine Ausgabe ersetzt. Ein nachfolgender Zeilenumbruch wird unterdrückt. Ergebnisse sind undefiniert, wenn der auszuführende Befehl ein Nullzeichen enthält. Dies ist eine GNU sed Erweiterung.
Das ist ein bisschen gewunden geschrieben. s///
Dies bedeutet, dass nach Abschluss eines Befehls für diese Zeile bei einer Änderung die (neue) Zeile als Befehl ausgeführt und ihre Ausgabe als Ersatz für diese Zeile verwendet wird.
Also für Ihren gegebenen Befehl:
echo AAA | sed -r 's/A/echo B/ge'
es ersetzt zuerst jedes A
durch echo B
und führt dann das Ergebnis als Befehl aus. Es hat (grob gesagt) den gleichen Effekt wie:
echo AAA | sed -r 's/A/echo B/g' | sh
GNU sed
unterstützt den gewünschten Modus nicht direkt, obwohl Sie ihn bei Bedarf mit einem komplexeren Skript vortäuschen können. Alternativ hat Perls /e
Modifikator für seinen s
Befehl das gewünschte Verhalten, jedoch stattdessen mit Perl-Ausdrücken.
Sie sind immer mehrere Ersatz, aber bekommt man nicht mehrere Ausführungen. Das Muster wird ausgeführt, sobald alle Ersetzungen vorgenommen wurden.
Ohne die
e
Flagge das Ergebnis vonist
Also das ist die Befehlszeile , die , wenn Sie ausgeführt hat sie die umfassen
e
Flagge, die äquivalent istquelle
Um 'BBB' von 'AAA' mit dem Befehl 's' von GNU sed mit dem Flag 'e' zu erhalten, kann man Folgendes tun:
Das 'AAA' wird durch 'echo -n B; echo -n B; echo -n B; ', was, wenn es schließlich ausgeführt wird, zu 3 nacheinander ausgeführten Echo-Befehlen führt, einen für jede der globalen Übereinstimmungen. Das '-n' lässt die Zeilenvorschubzeichen in der Echoausgabe weg, sodass die 'B' in einer Zeile landen (sed fügt jedoch einen Zeilenvorschub für sich an, wenn der Musterbereich endgültig gedruckt wird).
quelle
Ein paar Dinge:
(1) Der genaue Anwendungsfall, den Sie beschreiben, kann mit nur behandelt werden
(2) Wenn dies für die Ausführung genau das ist, was Sie möchten (für eine fortgeschrittenere Verwendung als nur das Echo), können Sie das
e
Flag als letzten Schritt verwenden:(3) Wenn Sie den Befehl nur ausführen möchten, wenn der ERSTE Ersatzbefehl etwas ersetzt hat, verwenden Sie einen Zweig:
Diese funktionieren nur in GNU
sed
wie oben beschrieben. BSDsed
(zumindest die Version, die ich habe) unterstützt die-r
Option nicht und erfordert ein Ende der Zeichenfolge, um einem Zweignamen zu folgen. (Sie können diesen letzten Punkt umgehen, indem Sie mehrere-e
Optionen mit Argumenten hinzufügen .)Beachten Sie, dass mit dem angegebenen Eingang (AAA) diese drei Einzeiler alle funktional identisch sind. Aber wenn der
echo
Befehl in etwas anderes geändert oder die-n
Option an übergebensed
würde, würden Sie den Unterschied sehen.quelle