Utilice grep para extraer texto de un archivo según expresiones regulares

Utilice grep para extraer texto de un archivo según expresiones regulares

Tengo este archivo:

header:
  title: hello
  version: 1.2.3

Quiero extraer el número de versión.

Mi intento original fue

grep ^\s+version:\s+(\d\.\d\.\d) file.txt

pero eso produjo una producción vacía. Después de las sugerencias en los comentarios, probé.

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

pero aparece "versión: 1.2.3" en lugar de "1.2.3".

¿Qué estoy haciendo mal?

Respuesta1

grepusosExpresión regular básica Posix( BRE) de forma predeterminada, lo que no admite su notación.

Úselo grep -Epara usar Posix Extended Regex ( ERE) y grep -Ppara usar Perl Compatible Regex ( PCRE) si está disponible.

Tu notación funciona con grep -P:

grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt

Esto funciona con BRE:

grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt

Producción:

  version: 1.2.3

Tenga en cuenta que el grupo de captura no es necesario aquí, ya que grepno hace nada con él.


Si desea solo la versión n.º,usar\Ky -oopción:

grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt

Producción:

1.2.3

Con BRE, esto no es posible, necesitarás encadenar dos grepcomandos:

grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'

o use sed(créditos @Kusalananda):

sed -n 's/.*version: //p' file.txt

Respuesta2

Según el comentario deplumoyCómo usar grep para obtener cualquier cosa justo después del nombreun comando de trabajo podría ser

 grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt

información relacionada