¿Cómo escapar del "interior" en perl?

Oct 29 2020

Estoy usando el siguiente script, pero obtengo un resultado inesperado.

perl -pi -e '/DB_CHARSET/ and $_.="define('SOMETHING'/, true);\n"' file.txt

Este comando agrega define(SOMETHING, true);

Dado que el texto comienza con 'luego tiene "adentro, ¿cómo escapo de' ALGO para terminar con define('SOMETHING', true)?

Lo intenté de costumbre y no ayudó.

Respuestas

10 ilkkachu Oct 29 2020 at 06:23

Podría usar, por ejemplo, \x27en la cadena de Perl (el código de carácter 'en hexadecimal):

$ perl -e 'print "foo\x27bar"' -l
foo'bar

o manejar las citas en el shell para darle a Perl un crudo ':

$ perl -e 'print "foo'\''bar"' -l
foo'bar

(Primero 'termina la cadena entre comillas, \'inserta la cita, el tercero 'comienza una nueva cadena entre comillas).

5 user414777 Oct 29 2020 at 06:43

Puede cambiar cada 'a '\''. Pero eso se pondrá feo pronto.

Una mejor idea es utilizar un documento aquí para su script:

perl -pi - <<'EOT' file.txt
/DB_CHARSET/ and $_.="define('SOMETHING'/, true);\n"
EOT

Note las comillas alrededor EOT. Si el terminador del documento aquí no está entre comillas (simples o dobles), las $variables de inicio, sustituciones aritméticas, comillas inversas, etc. se expandirán dentro del documento aquí. Esto es un poco diferente de here-documents en perl, donde solo las comillas simples evitarán expansiones de variables.

2 RakeshSharma Oct 29 2020 at 22:13

Una forma es utilizar -spara activar el procesamiento de conmutadores rudimentario en la línea de comandos de perl y, de ahí, definir una sola comilla allí:

$ perl -spi -e '$_  .= qq/define(${q}SOMETHING$q, true);/' -- -q=\'   file