En un entorno UNIX (BSD), me gustaría capturar una subcadena específica usando una expresión regular.
Suponga que dmesg
la salida del comando incluiría la siguiente línea:
pass2: <Marvell Console 1.01> Removable Processor SCSI device
Me gustaría capturar el texto entre <
y >
personajes, como
dmesg | <sed command>
debe generar:
Marvell Console 1.01
Sin embargo, no debería generar nada si la expresión regular no coincide. Muchas soluciones que incluyen sed -e 's/$regex/1/
generará la entrada completa si no se encuentra ninguna coincidencia, que no es lo que quiero.
La expresión regular correspondiente podría ser:regex="^pass2: <(.*)>"
¿Cómo haría correctamente una coincidencia de expresiones regulares usando sed
? o grep
? Tenga en cuenta que grep -P
La opción no está disponible en mi distribución BSD UNIX. El sed -E
Sin embargo, la opción está disponible.
Respuesta aceptada:
Prueba esto,
sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
O POSIXly (-E
aún no ha llegado al estándar POSIX a partir de 2019):
sed -n 's/^pass2:.*<(.*)>.*$/1/p'
Salida:
$ printf '%sn' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/1/p'
Marvell Console 1.01
Esto solo imprimirá la última ocurrencia de <...>
para cada línea.