Quando usar escape de estilo ANSI C bash, por ex. $ '\ n'

1

Eu não uso bash frequentemente, mas lembro que no passado para passar uma aba ou nova linha na linha de comando eu teria que escapar do caractere usando o caractere $ especial antes de uma única string entre aspas. Como $'\t' , $'\n' , etc. Eu tinha lido sobre citações e escapando no manual bash.

O que eu quero saber é quando é apropriado usar um escape de estilo ANSI C. Por exemplo, eu estava trabalhando com um regex no grep e parecia que eu precisava de um escape de estilo ANSI C para uma nova linha. Então eu mudei para perl e parecia que eu não fiz.

Tome por exemplo minha recente pergunta sobre stackoverflow sobre um regex perl que didn ' t trabalho. Aqui está o regex que eu estava usando:

echo -e -n "ab\r\ncd" | perl -w -e $'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'

Acontece que, na verdade, está incorreto porque eu dei o escape de estilo ANSI C da string usando $ . Eu só não entendo quando devo colocar o cifrão e quando não estou.

    
por test 13.09.2014 / 04:57

2 respostas

1

Você usa $'...' quando quiser que sequências de escape sejam interpretadas pelo shell.

$ echo 'a\nb'
a\nb

$ echo $'a\nb'
a
b

Na opção perl , -e , obtenha uma string. Se você usar $'...' , as seqüências de escape na string serão interpretadas antes de passar para perl . No seu caso, \r passou e nunca passou para perl .

com $'...' :

$ perl -MO=Deparse -we $'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
BEGIN { $^W = 1; }
binmode STDIN;
undef $/;
$_ = <ARGV>;
if (/ab\ncd/) {
    print 'test';
}
-e syntax OK

sem ele:

$ perl -MO=Deparse -we 'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
BEGIN { $^W = 1; }
binmode STDIN;
undef $/;
$_ = <ARGV>;
if (/ab\r\ncd/) {
    print 'test';
}
-e syntax OK
    
por 13.09.2014 / 05:52
1

$'\n' é basicamente o mesmo que digitar Enter .

Então, no seu exemplo de Perl, ele se transforma em *

  if(/ab
cd/)

Qual não é o que você queria.

Razões pelas quais posso pensar em usar $'...' :

  • Você deseja colocar uma aspa simples dentro de uma string delimitada por aspas simples, por exemplo %código%
  • Para tornar os caracteres não imprimíveis mais claros, por exemplo logger $'Can\'t open file' em vez de $'a\tb'

(Não tenho certeza se 'a<TAB character>b' é tratado como equivalente a \r\n ou se Perl vê o retorno de carro + nova linha, mas em ambos os casos, não é isso que você queria.)

    
por 13.09.2014 / 06:51