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

Wie speichere ich ein übereinstimmendes Muster mit dem Befehl „sed“ in einer Variablen?

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 und Y einschließlich aller Leerzeichen. Dies wird dann auf stdout ausgegeben. Dies ist die Ausgabe, die von der Shell erfasst und var 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.


Ubuntu
  1. So weisen Sie einer Variablen die Ausgabe eines Linux-Befehls zu

  2. So speichern Sie die Befehlsausgabe in einer Datei unter Linux

  3. Wie führen wir einen in einer Variablen gespeicherten Befehl aus?

  4. Wie starte ich Anydesk in Ubuntu über die Eingabeaufforderung?

  5. So starten Sie Linux über die Befehlszeile neu

So starten Sie Debian über die Befehlszeile neu

So erstellen Sie eine Datei in Linux mit Terminal

So erstellen Sie eine Datei in Ubuntu Linux mit Befehl und GUI

So aktualisieren Sie Ubuntu 16.04 LTS auf 20.04 LTS mit dem Befehlsterminal

So kopieren Sie Dateien unter Linux mit dem CP-Befehl

So verwenden Sie den nmap-Befehl