Ich versuche, ein Muster mit sed zu finden Befehl in file.txt zwischen dem ersten char1 und char2 und das dann durch string ersetzen. wie unten mit echo Modus Beispiel:
echo "This X is test Y. But X is not test Y." | sed 's/X[^Y]*Y/REPLACE/'
Außerdem muss ich übereinstimmende Muster speichern (wie is test {<–Leerzeichen sind wichtig} ) in einer Variablen.
Akzeptierte Antwort:
Hier ist ein einzelner Aufruf von sed, der die überarbeitete Zeile nach stdout schreibt und gleichzeitig den entfernten Text in der Shell-Variablen var speichert :
$ var=$(echo "This X is test Y. But X is not test Y." | sed -nr 'h;s/[^X]*X([^Y]*)Y.*/\1/;p;x;s/X[^Y]*Y/REPLACE/;w /dev/stderr') 2>&1
This REPLACE. But X is not test Y.
Der Wert von var ist:
$ echo "==$var=="
== is test ==
Erklärung:
-
hDieser Befehl kopiert das aktuelle Muster in den Haltebereich.
-
s/[^X]*X([^Y]*)Y.*/\1/;pDies entfernt alles aus dem Musterbereich außer dem Text zwischen dem ersten
XundYeinschließlich aller Leerzeichen. Dies wird dann auf stdout ausgegeben. Dies ist die Ausgabe, die von der Shell erfasst undvarzugewiesen wird . -
xDadurch wird der Haltebereich zurück in den Musterbereich kopiert. Wenn dies geschehen ist, enthält der Musterbereich eine Kopie der ursprünglichen Eingabezeile.
-
s/X[^Y]*Y/REPLACE/; w /dev/stderrDie Ersetzung wird durchgeführt und das Ergebnis in
stderrgeschrieben . -
2>&1Nachdem die Shell stdout in
varerfasst hat , weist dies die Shell an, stderr (die die Zeile mit REPLACE enthält) nach stdout zu kopieren.
Neben der Handhabung der Variablen var
Die Variable var enthält die führenden und nachfolgenden Leerzeichen. Wenn die Shell anschließend var unterwerfen würde zur Worttrennung würden diese Leerzeichen entfernt. Um das zu verhindern, wenn var referenziert wird, tun Sie dies in doppelten Anführungszeichen, wie im obigen Beispiel.