V prostředí (BSD) UNIX bych chtěl zachytit konkrétní podřetězec pomocí regulárního výrazu.
Předpokládejme, že dmesg
výstup příkazu bude obsahovat následující řádek:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
Chtěl bych zachytit text mezi <
a >
znaky, jako
dmesg | <sed command>
měl by vypsat:
Marvell Console 1.01
Pokud se však regulární výraz neshoduje, neměl by vypisovat nic. Mnoho řešení včetně sed -e 's/$regex/1/
vypíše celý vstup, pokud nebude nalezena žádná shoda, což není to, co chci.
Odpovídající regulární výraz může být:regex="^pass2: <(.*)>"
Jak bych správně provedl shodu regulárního výrazu pomocí sed
nebo grep
? Všimněte si, že grep -P
možnost není k dispozici v mé distribuci BSD UNIX. sed -E
možnost je však k dispozici.
Přijatá odpověď:
Zkuste toto,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Nebo POSIXly (-E
ještě nedosáhl standardu POSIX od roku 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Výstup:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
Tím se vytiskne pouze poslední výskyt <...>
pro každý řádek.