grep 201806{19..21} test
é expandido pelo shell para:
grep 20180619 20180620 20180621 test
Qual grep
entende como procurando 20180619
nos 3 arquivos, 20180620
, 20180621
e test
.
Se você alterar para:
grep -e201806{19..21} test
Então, isso é expandido para:
grep -e20180619 -e20180620 -e20180621 test
Que fornece 3 e
xpressions para grep
para pesquisar em test
.
Ou você pode fazer:
printf '%s\n' 201806{19..21} | grep -f - test
Onde passamos as expressões como um número de linhas de entrada para grep
(com algumas implementações, você pode precisar de /dev/stdin
no lugar de -
).
Com zsh
especificamente, você também pode:
numbers=({19..21} 25 31)
grep -E "201801(${(j:|:)numbers})" test
Onde usamos o sinalizador de expansão do parâmetro (j:|:)
para unir os elementos da matriz com |
(o operador de alternância de expressão regular estendida) para que ele possa ser usado como um ERE.
Ou você poderia amarrar essa matriz a um escalar de expressão regular com:
$ typeset -T re numbers '|'
$ numbers=({19..21} 25 31)
$ echo $re
19|20|21|25|31
Embora as expressões regulares normalmente não tenham recursos de correspondência de intervalo de numeração, zsh
patterns (que com extendedglob
são funcionalmente equivalentes a expressões regulares) fazem com o operador <x-y>
(somente para sequências de dígitos decimais):
print -rl -- ${(M)${(f)"$(<test)"}:#*201806<19-21>*}