GNU/Linux >> Znalost Linux >  >> Linux

Extrahovat podřetězec podle Regexp s Sed nebo Grep?

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.


Linux
  1. Doplnění s „sed“?

  2. Linux – nalezení podřetězce v souborech napříč podadresáři pomocí jediného vestavěného příkazu?

  3. Jak rekurzivně nahradit znaky sed?

  1. Barvení výstupu ocasu pomocí Sed?

  2. Zachyťte skupiny pomocí Awk nebo Grep?

  3. Jak se popasovat s barevným výstupem

  1. Jak použít sed k extrakci podřetězce

  2. Použití sed k rozdělení řetězce s oddělovačem

  3. sed vložte řádek s mezerami na konkrétní řádek