Die Flags arbeiten entgegengesetzt zu dem, was Sie erwarten, zusammen. Die Dokumentation von /e
ist fürs Protokoll:
Dieser Befehl ermöglicht es, Eingaben von einem Shell-Befehl in den Musterbereich zu leiten. Wenn eine Ersetzung vorgenommen wurde, wird der im Musterbereich gefundene Befehl ausgeführt und der Musterbereich durch seine Ausgabe ersetzt. Ein abschließender Zeilenumbruch wird unterdrückt; Ergebnisse sind undefiniert, wenn der auszuführende Befehl ein Nullzeichen enthält. Dies ist eine GNU-sed-Erweiterung.
Das ist etwas umständlich geschrieben. Das bedeutet, dass nach Abschluss einer s///
Befehl für diese Zeile, wenn es eine Änderung gab, wird die (neue) Zeile als Befehl ausgeführt und ihre Ausgabe als Ersatz für diese Zeile verwendet.
Also für Ihren gegebenen Befehl:
echo AAA | sed -r 's/A/echo B/ge'
es ersetzt zunächst jede A
mit echo B
, und dann führt das Ergebnis als Befehl aus. Es hat (grob gesagt) die gleiche Wirkung 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 Perls /e
Modifikator zu seinem s
Befehl hat das gesuchte Verhalten, aber stattdessen mit Perl-Ausdrücken.
Sie sind Sie erhalten mehrfachen Ersatz, aber Sie erhalten keine mehrfachen Hinrichtungen. Das Muster wird ausgeführt, sobald alle Ersetzungen vorgenommen wurden.
Ohne e
Flag das Ergebnis von
echo AAA | sed -r 's/A/echo B/g'
ist
echo Becho Becho B
Das ist also die Befehlszeile, die ausgeführt wird, wenn Sie es tun schließen Sie den e
ein flag, was äquivalent zu
echo 'Becho Becho B'
Um 'BBB' von 'AAA' mit dem 's'-Befehl von GNU sed mit dem 'e'-Flag zu erhalten, kann man Folgendes tun:
echo AAA | sed -re 's/A/echo -n B;/ge'
Das 'AAA' wird ersetzt 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 aus der Ausgabe von echo weg, wodurch die 'B's auf einer Zeile landen (aber sed hängt selbst einen Zeilenvorschub an, wenn es schließlich den Musterraum ausgibt).