Ich habe eine Liste von zufälligen Speicheradressen in einer Textdatei gespeichert, und ich muss sed
sie 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 sed
Befehls. 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 sed
KEINE Befehle ausgeführt werden. Stimmt es, dass sed
Befehle nicht ausgeführt werden können? Wenn ja, unter der Annahme, dass der von mir geschriebene Befehl eine gültige sed
Sequenz ist, wie würde ich ihn schreiben perl
?
quelle
Antworten:
perl -pe
: likesed
: Verarbeiten Sie die Eingabe zeilenweise in$_
, bewerten Sie den-e
für jede Zeile übergebenen Perl [e] -Ausdruck und [p] drucken Sie den geänderten$_
für jede Zeile aus.s|X|Y|gei
: ErsatzY
für dieX
in$_
([g] lobally, Rs [i] nsensitively und BehandlungY
anstelle eines Grund Zeichenfolge als perl [e] xpression).(?<=0x)
: schau nach hinten0x
.[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.quelle
/
, da es im Ersatzteil verwendet wird. Korrigiert.Es kann wahr sein oder nicht, dass
sed
keine Befehle ausgeführt werden können. Es gilt nicht für eine GNUsed
:Mir ist nicht klar, was sonst noch in Ihrer
<$1
Eingabe enthalten sein könnte, und deshalb achte ich darauf#
, alles zu kommentieren, was sich nichtcommand \2
im Musterraum befindet. Wenn Sie dase
xecute-Flag von GNU für eines///
Ubstitution verwenden, wird der gesamte resultierende Musterraum$SHELL -c
als 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.quelle