¿Cómo escapar del "interior" en perl?
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
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).
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.
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