Procura por um número preciso com grep

5

Estou tentando procurar linhas em um arquivo que tenha uma ou mais instâncias de 1234 , mas nenhum outro número (caracteres não dígitos são permitidos). Qualquer outro número deve fazer com que a linha não corresponda.

Exemplos válidos:

  • 1234
  • 1234 xxx
  • xxx 1234
  • 1234 1234
  • 1234 xxx 1234

Exemplos inválidos:

  • 12341234
  • 12345
  • 1234xxx345
  • 1234 345
  • 1234xxx
  • xxx1234
  • 1234xxx1234

Isso é o que eu usei:

grep -E '^([^0-9]*1234)+[^0-9]*$' file.txt

Mas este comando também gera 12341234 como válido, como evito isso?

    
por KLMM 27.09.2015 / 02:13

3 respostas

4
grep -E '^[^0-9]*1234([^0-9]+1234)*[^0-9]*$' file.txt

Explicação

  • ^[^0-9]*1234 : encontre a primeira correspondência de 1234 , que pode ser precedida por caracteres não dígitos.
  • ([^0-9]+1234)* : pode haver mais iterações de 1234 , mas elas devem ser separadas do primeiro 1234 (e outros 1234 ) por caracteres não dígitos (portanto use + ).
  • [^0-9]*$ : corresponde à linha inteira (com $ ). Pode haver caracteres não dígitos após o 1234 final (mas não necessariamente, portanto, * ).

EDITAR

Se 1234 precisar ser delimitado por espaços (ou estar no início ou no final da linha), use

grep -E '^([^0-9]* )?1234(( [^0-9]*)? 1234)*( [^0-9]*)?$'

Explicação

  • ^([^0-9]* )? : pode haver caracteres não dígitos para começar, contanto que eles terminem com um espaço.
  • 1234 : encontre a primeira correspondência (obrigatória) de 1234 .
  • (( [^0-9]*)? 1234)* : Eu vou trabalhar com os parênteses para trás. Pode haver (zero ou mais) cópias adicionais de 1234 , mas elas devem ser precedidas por um espaço, ou seja, 1234 . Antes desse espaço, pode haver caracteres não dígitos, o que é bom contanto que eles sejam separados da cópia anterior de 1243 por outro espaço, ou seja, ( [^0-9]*)? .
  • ( [^0-9]*)?$ : pode haver caracteres não dígitos para terminar, desde que sejam precedidos por um espaço.
por 27.09.2015 / 03:09
5

awk pode ser mais prático do que grep . Configure o separador de campo para execuções de caracteres não digitados, depois percorra os campos e apenas imprima a linha se cada campo não vazio for exatamente igual a 1234

awk -F'[^[:digit:]]+' '{
  for(i=1; i<=NF; ++i) 
  if (($i) && ($i != 1234)) next
  }; {print}' file.txt
    
por 27.09.2015 / 04:59
3

Pesquise o número no início da linha ( ^ ) ou precedido por um não dígito ( [^0-9] ) e também no final ( $ ou [^0-9] ).

grep -E '(^|[^0-9])1234($|[^0-9])' file.txt

Se você quiser permitir zeros à esquerda, adicione 0* antes do número.

grep -E '(^|[^0-9])0*1234($|[^0-9])' file.txt

Se você também quiser rejeitar linhas que contenham qualquer seqüência de um ou mais dígitos que não façam parte de uma ocorrência desse número específico, então você está procurando por linhas que consistem em sequências alternando um ou mais não-dígitos e esse número em particular , que é basicamente ([^0-9]+1234)* . A linha pode começar e terminar com o número ou com um não-dígito, enquanto as sequências internas de não-dígitos podem não estar vazias. Além disso, a linha deve conter o número pelo menos uma vez. Juntando tudo:

grep -xE '[^0-9]*1234([^0-9]+1234)*[^0-9]*' file.txt
    
por 27.09.2015 / 02:27

Tags