Führen Sie einen Befehl in 'sed' aus.

9

Ich habe eine Liste von zufälligen Speicheradressen in einer Textdatei gespeichert, und ich muss sedsie herausnehmen, dekodieren und wieder in meiner Datei speichern. Die Dekodierungsoperation, die ich ausführen möchte, wird jedoch in einem C ++ - Programm ausgeführt, das ich vor einiger Zeit erstellt habe. Das Problem, auf das ich jetzt stoße, ist die Ausführung von C ++ innerhalb des sedBefehls. Das heißt, ich möchte auf den Teil zurückgreifen, der dekodiert werden muss, und ihn als Argument in meinem C ++ - Programm verwenden. Ich habe den folgenden Befehl geschrieben:

cat $1 | sed -r 's/(0[Xx])([0-9A-Za-z]{1,8})/\1`./convAddrs \2`/g';

bevor ich die Gelegenheit hatte, eine Antwort in diesem Beitrag zu lesen, die besagt, dass sedKEINE Befehle ausgeführt werden. Stimmt es, dass sedBefehle nicht ausgeführt werden können? Wenn ja, unter der Annahme, dass der von mir geschriebene Befehl eine gültige sedSequenz ist, wie würde ich ihn schreiben perl?

Fadi Hanna AL-Kass
quelle
Link hinzugefügt. mein schlechtes :)
Fadi Hanna AL-Kass

Antworten:

8
perl -pe 's|(?<=0x)[0-9a-f]{1,8}|`./convAddrs $&`|gei'
  • perl -pe: like sed: Verarbeiten Sie die Eingabe zeilenweise in $_, bewerten Sie den -efür jede Zeile übergebenen Perl [e] -Ausdruck und [p] drucken Sie den geänderten $_für jede Zeile aus.
  • s|X|Y|gei: Ersatz Yfür die Xin $_([g] lobally, Rs [i] nsensitively und Behandlung Yanstelle eines Grund Zeichenfolge als perl [e] xpression).
  • (?<=0x): schau nach hinten 0x.
  • [0-9a-f]{1,8}: eine bis 8 hexadezimale Ziffern, so viele wie möglich
  • `./convAddrs $&`: Ersetzen durch die Ausgabe der Shell-Befehlszeile, in der $&das übereinstimmende Teil ersetzt wird.
Stéphane Chazelas
quelle
Bei der Ausführung Ihres Befehls wird die folgende Fehlermeldung angezeigt: In -e Zeile 1 ist kein Leerzeichen zwischen Muster und folgendem Wort veraltet. Die Regexp-Modifikatoren "/ a" und "/ d" schließen sich in -e Zeile 1 am Ende gegenseitig aus der Zeilen-Regexp-Modifikatoren "/ a" und "/ d" schließen sich in -e Zeile 1 am Zeilenende gegenseitig aus. Der String-Terminator "` "kann nirgendwo vor EOF in -e Zeile 1 gefunden werden.
Fadi Hanna AL-Kass
1
Tut mir leid, mein Schlechtes, Sie müssen das Trennzeichen natürlich ändern, da wir es hier nicht verwenden können /, da es im Ersatzteil verwendet wird. Korrigiert.
Stéphane Chazelas
Verdammt, und ich dachte, dass ich ziemlich gut in Perl One Liner war, +1!
Terdon
2

Es kann wahr sein oder nicht, dass sedkeine Befehle ausgeführt werden können. Es gilt nicht für eine GNU sed:

sed -Ee 's/(0[Xx])([0-9A-Za-z]{1,8})/\1\n ./convAddrs \2\n#/g' \
-eh -e  's/\n.//gp;g;s/^/#/e' <"$1"

Mir ist nicht klar, was sonst noch in Ihrer <$1Eingabe enthalten sein könnte, und deshalb achte ich darauf #, alles zu kommentieren, was sich nicht command \2im Musterraum befindet. Wenn Sie das execute-Flag von GNU für eine s///Ubstitution verwenden, wird der gesamte resultierende Musterraum $SHELL -cals zweites Argument übergeben und anschließend der gesamte Musterraum durch das ersetzt, was in die Standardausgabe geschrieben wurde $SHELL. Also drucke ich oben, was auch immer Ihre Ergebnisse waren, zuerst und dann nach den Ergebnissen der Übergabe der Befehlszeile an die Shell.

mikeserv
quelle