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:
-
h
Dieser Befehl kopiert das aktuelle Muster in den Haltebereich.
-
s/[^X]*X([^Y]*)Y.*/\1/;p
Dies entfernt alles aus dem Musterbereich außer dem Text zwischen dem ersten
X
undY
einschließlich aller Leerzeichen. Dies wird dann auf stdout ausgegeben. Dies ist die Ausgabe, die von der Shell erfasst undvar
zugewiesen wird . -
x
Dadurch 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/stderr
Die Ersetzung wird durchgeführt und das Ergebnis in
stderr
geschrieben . -
2>&1
Nachdem die Shell stdout in
var
erfasst 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.