Use grep para extrair algum texto do arquivo baseado em regex

Use grep para extrair algum texto do arquivo baseado em regex

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

grepusaRegex Básico Posix( BRE) por padrão, que não suporta sua notação.

Use grep -Epara usar Posix Extended Regex ( ERE) e grep -Ppara 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 grepnão faz nada com ele.


Se você quiser apenas o número da versão.,usar\Ke -oopção:

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

Saída:

1.2.3

Com BREisso não é possível, você precisará encadear dois grepcomandos:

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

informação relacionada