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

sed e- und g-Flags funktionieren nicht zusammen

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

ist
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).


Linux
  1. Grub Rettungskommando. Grub funktioniert nicht in Ubuntu 13?

  2. id:Befehl nicht gefunden

  3. w:Befehl nicht gefunden

  4. df:Befehl nicht gefunden

  5. du:Befehl nicht gefunden

16 Praktische und nützliche Beispiele für Echo Command unter Linux

Traceroute-Befehl funktioniert nicht unter Ubuntu

sudo und nohup zusammenarbeiten lassen

Warum wird der Befehl sudo:bundle nicht gefunden?

Conda-Befehl funktioniert in der Eingabeaufforderung, aber nicht im Bash-Skript

Warum funktioniert mein Crontab nicht und wie kann ich es beheben?