Procurando grep ou egrep, o ano varia de 1965 a 1996

Procurando grep ou egrep, o ano varia de 1965 a 1996

Eu tenho um grep que funciona para algumas datas, mas estou tendo problemas para fazer meu cérebro torná-lo totalmente funcional.

grep 19[6-9][5-6]$ filename

captura alguns corretamente, mas pretendo capturar todos os anos entre 1965-1996.

Aqui está a solução atual, mas na verdade estou procurando uma linha, mas aqui está o que consegui até agora:

grep 196[5-9]$ filename
grep 197[0-9]$ filename
grep 198[0-9]$ filename
grep 199[0-6]$ filename

Procurando por melhor e mais curto, se possível?

Responder1

Intervalos de datas e regex não são uma combinação tão boa. Se eu interpretar $ no seu grep corretamente, a data será o último campo de uma linha.

Experimente isto:

awk '$NF >= 1965 && $NF <= 1996' filename

Se você precisar usar grep, ficará mais complicado:

grep -E '196[5-9]|19[78][0-9]|199[0-6]$' filename

Responder2

Você deve observar que egrepisso permite que 19seja fatorado, assim:

grep -E '19(6[5-9]|[78][0-9]|9[0-6])$' filename

o que pode ser considerado mais claro.

Responder3

Você também pode usar seqo que considero muito mais legível:

grep -E "$(seq -s "|" 1965 1996)" filename

-s, --separador=STRING

Responder4

Usando a sintaxe padrão greppara extrair linhas que terminam com qualquer número de substring no intervalo inclusivo de 1965 a 1996 (isso também ésemelhanteà tentativa do usuário na pergunta):

grep -e '196[5-9]$' \
     -e '197[0-9]$' \
     -e '198[0-9]$' \
     -e '199[0-6]$'

Isso extrai linhas que terminam com qualquer um dos números de seu interesse. Observe que as expressões geralmente devem ser colocadas entre aspas.

Para evitar correspondência, por exemplo 231974(que corresponde a 1974), no final da linha, você pode inserir \<no início de cada número no padrão:

grep -e '\<196[5-9]$' \
     -e '\<197[0-9]$' \
     -e '\<198[0-9]$' \
     -e '\<199[0-6]$'

Isso força o número a ser uma palavra e não uma substring de alguma outra palavra mais longa.

informação relacionada