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.