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 egrep
isso permite que 19
seja 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 seq
o que considero muito mais legível:
grep -E "$(seq -s "|" 1965 1996)" filename
-s, --separador=STRING
Responder4
Usando a sintaxe padrão grep
para 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.