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.