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

Substring nach Regexp mit Sed oder Grep extrahieren?

In einer (BSD) UNIX-Umgebung möchte ich einen bestimmten Teilstring mit einem regulären Ausdruck erfassen.

Angenommen, die Datei dmesg Die Befehlsausgabe würde die folgende Zeile enthalten:

pass2: <Marvell Console 1.01> Removable Processor SCSI device

Ich möchte den Text zwischen < erfassen und > Zeichen wie

dmesg | <sed command>

sollte ausgeben:

Marvell Console 1.01

Es sollte jedoch nichts ausgegeben werden, wenn die Regex nicht übereinstimmt. Viele Lösungen einschließlich sed -e 's/$regex/1/ wird die gesamte Eingabe ausgeben, wenn keine Übereinstimmung gefunden wird, was nicht das ist, was ich will.

Der entsprechende reguläre Ausdruck könnte wie folgt aussehen:
regex="^pass2: <(.*)>"

Wie würde ich eine Regex-Übereinstimmung mit sed richtig durchführen? oder grep ? Beachten Sie, dass grep -P Option ist in meiner BSD-UNIX-Distribution nicht verfügbar. Der sed -E Option ist jedoch verfügbar.

Akzeptierte Antwort:

Probieren Sie es aus,

sed -nE 's/^pass2:.*<(.*)>.*$/1/p'

Oder POSIXly (-E hat es bis 2019 noch nicht zum POSIX-Standard geschafft):

sed -n 's/^pass2:.*<(.*)>.*$/1/p'

Ausgabe:

$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01

Dadurch wird nur das letzte Vorkommen von <...> gedruckt für jede Zeile.


Linux
  1. Grep mit logischen Operatoren?

  2. Alle C-Kommentare mit Sed löschen?

  3. Schwanzausgabe mit Sed einfärben?

  4. Wie man mit der Farbausgabe umgeht

  5. Mit einem einzigen integrierten Befehl eine Teilzeichenfolge in Dateien über Unterverzeichnisse hinweg finden?

Bearbeiten von Text mit sed und grep

Grep-Befehl in Linux (mit Beispielen)

10 praktische Beispiele für Regex mit grep

So entfernen Sie \r-Zeichen mit sed

Wie kann man Zeichen rekursiv durch sed ersetzen?

So grep ps-Ausgabe mit Headern