Existe uma questão semelhante em stackoverflow , mas não funciona com o bash.
O que é necessário para fazê-lo funcionar com bash, para usar com scripts/variáveis?
Estou falando dos códigos ISO 639-1 ou ISO 639-2.
Meu bash é GNU 4.3.
Exemplo:
root@box ~/test2 # ls
eng en-US por pt-BR
O regex nessas páginas falha:
root@box ~/test2 # ls | grep ^[a-z]{2}-[A-Z]{2}$
root@box ~/test2 # ls | grep ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep ^[a-z]{2}(-[A-Z]{2})*
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep "^[a-z]{2}(-[A-Z]{2})*"
{n}
sem barra invertida faz parte de expressões regulares estendidas, então você precisa do-E
sinalizador para grep. Além disso, você deseja citar o regex, pois, como você viu, os parênteses e as chaves têm um significado especial para o shell.Ou apenas com Bash:
(A
[[ .. ]]
construção de teste é especial, as chaves e parênteses têm um significado diferente dentro dela e, de fato, o regex deve ser colocado sem aspas aqui. Observe que isso é totalmente diferente de[ .. ]
. Veja, por exemplo , BashGuide em condicionais )A
[a-zA-Z]{1,8}
parte corresponde a strings de até oito letras, e a final*
permite um número arbitrário de repetições do grupo entre parênteses, então isso também corresponderia a algo comofoobar-foobar-foobar
.Poderíamos alterar o padrão para
^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,3})?$
permitir apenas códigos com duas ou três letras e apenas uma-xx
parte final, se isso for tudo o que você precisa.Sem aspas
{1,8}
está a expansão de cintas :e sem aspas
[]
é uma correspondência de padrão de nome de arquivo (glob) ...Primeiro, você precisa citar os
regex
requisitos do grep usandogrep 'regex'
Então, você usará o suporte regex estendido em grep usando
egrep
ougrep -E
e isso funcionará bem:ou você pode usar grep clássico - regex básico, mas precisa escapar
{
e}
:Para esses dados conforme sua pergunta
A saída em ambos os casos grep será
-E
grep -E "^[a-z]{2}-[A-Z]{2}$"