Eu tenho este arquivo:
header:
title: hello
version: 1.2.3
Quero extrair o número da versão.
Minha tentativa original foi
grep ^\s+version:\s+(\d\.\d\.\d) file.txt
mas isso produziu uma saída vazia. Depois de sugestões nos comentários, tentei
grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
mas recebo "versão: 1.2.3" em vez de "1.2.3".
O que estou fazendo de errado?
Responder1
grep
usaRegex Básico Posix( BRE
) por padrão, que não suporta sua notação.
Use grep -E
para usar Posix Extended Regex ( ERE
) e grep -P
para usar Perl Compatível Regex ( PCRE
) se disponível.
Sua notação funciona com grep -P
:
grep -P '^\s+version:\s+(\d\.\d\.\d)' file.txt
Isso funciona com BRE
:
grep '^ \+version: \+\([0-9]\.[0-9]\.[0-9]\)' file.txt
Saída:
version: 1.2.3
Observe que o grupo de captura não é necessário aqui, pois grep
não faz nada com ele.
Se você quiser apenas o número da versão.,usar\K
e -o
opção:
grep -Po '^\s+version:\s+\K\d\.\d\.\d' file.txt
Saída:
1.2.3
Com BRE
isso não é possível, você precisará encadear dois grep
comandos:
grep 'version: ' file.txt | grep -o '[0-9]\.[0-9]\.[0-9]'
ou use sed
(créditos @Kusalananda):
sed -n 's/.*version: //p' file.txt
Responder2
De acordo com o comentário depLumoeComo usar o grep para obter qualquer coisa logo após o nomeum comando de trabalho poderia ser
grep -oP "(?<=version: )(\d\.\d\.\d)" file.txt