Recentemente tive problemas com algum regex na linha de comando e
descobriram que, para combinar uma barra invertida, diferentes números de
caracteres podem ser usados. Este número depende da cotação usada para
o regex (nenhum, aspas simples, aspas duplas). Veja o seguinte
sessão bash para o que quero dizer:
echo "#ab\cd" > file
grep -E ab\cd file
grep -E ab\cd file
grep -E ab\\cd file
grep -E ab\\cd file
#ab\cd
grep -E ab\\\cd file
#ab\cd
grep -E ab\\\cd file
#ab\cd
grep -E ab\\\\cd file
#ab\cd
grep -E ab\\\\cd file
grep -E "ab\cd" file
grep -E "ab\cd" file
grep -E "ab\\cd" file
#ab\cd
grep -E "ab\\cd" file
#ab\cd
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\\cd" file
grep -E 'ab\cd' file
grep -E 'ab\cd' file
#ab\cd
grep -E 'ab\\cd' file
#ab\cd
grep -E 'ab\\cd' file
Isso significa que:
- sem aspas, posso fazer a correspondência de uma barra invertida com 4-7 barras invertidas reais
- com aspas duplas, posso combinar uma barra invertida com 3-6 barras invertidas reais
- Com aspas simples, posso corresponder uma barra invertida com 2-3 barras invertidas reais
Eu entendo que uma barra invertida extra é ignorada pelo shell (de
a página man bash):
"Uma barra invertida sem aspas (\) é o caractere de escape. Ele preserva
o valor literal do próximo caractere que segue "
Isso não se aplica aos exemplos de citações simples, porque não
O escape é feito entre aspas simples.
E uma contrabarra adicional é ignorada pelo comando grep ("\ c"
é apenas "c" escapou, mas isso é exatamente o mesmo que "c", porque "c"
não tem um significado especial em uma regex).
Isso explica o comportamento do exemplo com aspas simples, mas
Eu realmente não entendo os outros dois exemplos, especialmente porque
há uma diferença entre sequências não-qouted de aspas duplas.
Mais uma vez, uma citação da página man bash:
"Incluir caracteres entre aspas duplas preserva o valor literal
de todos os caracteres entre aspas, com exceção de $, ', \,
e, quando a expansão do histórico estiver ativada,!. "
Eu tentei o mesmo com o GNU awk (por exemplo, awk /ab\cd/{print} file
),
com os mesmos resultados.
Perl, no entanto, mostra resultados diferentes (usando, por exemplo, perl -ne
"/ab\cd/"\&\&print file
):
- sem aspas, posso fazer a correspondência de uma barra invertida com 4-5 barras invertidas reais
- com aspas duplas, posso combinar uma barra invertida com 3-4 barras invertidas reais
- Com aspas simples, posso fazer a correspondência de uma barra invertida com duas barras invertidas reais
Alguém pode explicar essa diferença entre não citado e double-qouted
strings regex na linha de comando para grep e awk?
Eu não estou tão interessado em uma explicação do comportamento do Perl, já que eu não costumo usar o one-liner do Perl.