Cuándo usar bash ANSI C style escape, p. Ej. $ '\ N'

No uso bash a menudo, pero recuerdo que en el pasado para pasar una pestaña o línea nueva en la línea de command, tenía que escaping del personaje usando el carácter $ especial antes de una única cadena entre comillas. Me gusta $'\t' , $'\n' , etc. Había leído sobre las citas y cómo había escapado en el manual de bash.

Lo que quiero saber es cuándo es apropiado usar un escape de estilo ANSI C. Por ejemplo, estaba trabajando con una expresión regular en grep y parecía que necesitaba un escape de estilo ANSI C para una nueva línea. Luego cambié a Perl y parecía que no.

Tomemos como ejemplo mi pregunta reciente sobre stackoverflow sobre un Perl Regex que no funcionó. Aquí está la expresión regular que estaba usando:

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

Resulta que en realidad es incorrecto porque le di a la cadena escape de estilo ANSI C usando $ . Simplemente no entiendo cuándo debo preceder el signo de dólar y cuándo no.

    Usas $'...' cuando quieres que las secuencias de escape sean interpretadas por el intérprete de commands.

     $ echo 'a\nb' a\nb $ echo $'a\nb' a b 

    En perl , la opción -e obtiene una cadena. Si usa $'...' , las secuencias de escape en cadena se interpretan antes de pasar a perl . En tu caso, se había ido y nunca pasó a perl .

    Con $'...' :

     $ 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 

    Sin ello:

     $ 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 

    $'\n' es básicamente lo mismo que escribir Enter .

    Entonces en tu ejemplo de Perl, se convierte en *

      if(/ab cd/) 

    Que no es lo que querías

    Razones por las que se me ocurre usar $'...' :

    • Desea colocar una comilla simple dentro de una cadena delimitada de una sola comilla, por ejemplo, logger $'Can\'t open file'
    • Para hacer más claros los caracteres no imprimibles, por ejemplo, $'a\tb' lugar de 'a<TAB character>b'

    (No estoy seguro si \r\n se trata como equivalente a \n o si Perl ve el retorno de carro + nueva línea, pero en cualquier caso, no es lo que usted quería).