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.