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>*}