Cadeias de caracteres Grep com caracteres numéricos aleatórios

4

Eu quero grep linhas contendo

 - 0 amount
 - 122,000,000 amount
 - 50,000 amount

Eu tentei usar

grep -rhI " - * amount ".

mas irá produzir qualquer coisa que contenha

 - 

independentemente de conter

amount

O problema é que eu quero apenas strings com

 - * amount

em que * indica algo entre - (here) amount . É aceitável se as linhas contendo apenas "-" forem descartadas.

Mas isso não funciona.

    
por Thomas Bishop 16.05.2017 / 10:01

3 respostas

6

O * corresponderá a zero ou mais do caractere anterior ou padrão.

Isso significa que - * amount corresponderá a

  • - amount
  • - amount
  • - amount
  • (etc.)

Para corresponder os números, como você os escreveu, use - [0-9,]+ amount como padrão. O + forçará pelo menos uma correspondência da expressão regular anterior e [0-9,] corresponderá a qualquer dígito ou vírgula.

Dado o seguinte arquivo:

 - 0 amount
 - 122,000,000 amount
 - 50,000 amount

 - amount
 -     amount
 - some amount

Isso funcionará:

$ grep -E -e '- [0-9,]+ amount' file
 - 0 amount
 - 122,000,000 amount
 - 50,000 amount

O -E é necessário porque + é uma expressão regular estendida, e o -e é necessário porque senão o - no padrão seria interpretado como uma opção para grep ( -e significa a próxima coisa é uma expressão regular para grep se aplicar à sua entrada).

Você também pode ancorar o padrão no início e no final da linha:

$ grep -E '^ - [0-9,]+ amount$' file

Isso significa que o -e não é mais necessário e garantirá que a linha comece com um espaço seguido pelo traço e o número etc. como antes. A string amount deve ser a última coisa na linha (ancoramos a palavra ao final da linha com $ ).

    
por 16.05.2017 / 10:10
1

Algo parecido pode fazer o trabalho (com o awk script, procure pelo 1º token para ser traço e 3º para ser string "amount"):

awk '$1=="-" && $3=="amount" {print $2}'

Se você quiser que toda a linha seja impressa, use algo como:

awk '$1=="-" && $3=="amount" {print}'
    
por 16.05.2017 / 10:07
0

Você também pode usar

grep -rhI -- '- [^ ]* amount' /path/to/parent/dir/*

onde [^ ]* significa corresponder a qualquer número de qualquer caractere, exceto um espaço.

    
por 16.05.2017 / 10:20

Tags