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.