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.