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
grep
usosExpresión regular básica Posix( BRE
) de forma predeterminada, lo que no admite su notación.
Úselo grep -E
para usar Posix Extended Regex ( ERE
) y grep -P
para 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 grep
no hace nada con él.
Si desea solo la versión n.º,usar\K
y -o
opció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 grep
comandos:
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