GNU/Linux >> Linux Esercitazione >  >> Linux

Estrarre la sottostringa secondo Regexp con Sed o Grep?

In un ambiente UNIX (BSD), vorrei acquisire una sottostringa specifica utilizzando un'espressione regolare.

Supponiamo che il dmesg l'output del comando includerebbe la seguente riga:

pass2: <Marvell Console 1.01> Removable Processor SCSI device

Vorrei catturare il testo tra il < e > personaggi, come

dmesg | <sed command>

dovrebbe produrre:

Marvell Console 1.01

Tuttavia, non dovrebbe produrre nulla se l'espressione regolare non corrisponde. Molte soluzioni tra cui sed -e 's/$regex/1/ produrrà l'intero input se non viene trovata alcuna corrispondenza, che non è quello che voglio.

L'espressione regolare corrispondente potrebbe essere:
regex="^pass2: <(.*)>"

Come farei correttamente una corrispondenza regex usando sed o grep ? Nota che il grep -P l'opzione non è disponibile nella mia distribuzione UNIX BSD. Il sed -E l'opzione è tuttavia disponibile.

Risposta accettata:

Prova questo,

sed -nE 's/^pass2:.*<(.*)>.*$/1/p'

O POSIXly (-E non ha ancora raggiunto lo standard POSIX a partire dal 2019):

sed -n 's/^pass2:.*<(.*)>.*$/1/p'

Uscita:

$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01

Questo stamperà solo l'ultima occorrenza di <...> per ogni riga.


Linux
  1. Aggiunta con 'sed'?

  2. Grep con operatori logici?

  3. Colorare l'output della coda con Sed?

  4. Cattura gruppi con Awk o Grep?

  5. sed inserisce una riga con spazi in una riga specifica

Manipolazione del testo con sed e grep

Comando Grep in Linux (con esempi)

10 esempi pratici di regex con grep

Utilizzo di sed per dividere una stringa con un delimitatore

Come rimuovere il carattere \r con sed

Riempire con zero i numeri fino a 2 cifre con sed