GNU/Linux >> Tutoriales Linux >  >> Linux

¿Extraer subcadena según Regexp con Sed o Grep?

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.


Linux
  1. Adición Con 'sed'?

  2. Linux:¿encontrar una subcadena en archivos en subdirectorios con un solo comando incorporado?

  3. ¿Colorear la salida de la cola con Sed?

  4. ¿Capturar grupos con Awk o Grep?

  5. línea de inserción sed con espacios a una línea específica

Manipulación de texto con sed y grep

Comando Grep en Linux (con ejemplos)

10 ejemplos prácticos de expresiones regulares con grep

Usando sed para dividir una cadena con un delimitador

¿Cómo reemplazar recursivamente los caracteres con sed?

Cómo grep salida ps con encabezados