Comment échapper à 'inside' en perl?
J'utilise le script suivant, mais j'obtiens une sortie inattendue.
perl -pi -e '/DB_CHARSET/ and $_.="define('SOMETHING'/, true);\n"' file.txt
Cette commande ajoute define(SOMETHING, true);
Puisque le texte commence par «alors ayez» à l'intérieur, comment puis-je échapper à quelque chose de sorte que je me retrouve avec define('SOMETHING', true)?
J'ai essayé d'habitude \ et cela n'a pas aidé.
Réponses
Vous pouvez utiliser par exemple \x27dans la chaîne Perl (le code de caractère pour 'en hexadécimal):
$ perl -e 'print "foo\x27bar"' -l
foo'bar
ou gérez les guillemets dans le shell pour donner à Perl une valeur brute ':
$ perl -e 'print "foo'\''bar"' -l
foo'bar
(Le premier 'termine la chaîne entre guillemets, \'insère le guillemet, le troisième 'commence une nouvelle chaîne entre guillemets.)
Vous pouvez tous les changer 'en '\''. Mais ça va devenir moche bientôt.
Une meilleure idée est d'utiliser un document ici pour votre script:
perl -pi - <<'EOT' file.txt
/DB_CHARSET/ and $_.="define('SOMETHING'/, true);\n"
EOT
Notez les citations autour EOT. Si le terminateur ici-document n'est pas entre guillemets (simples ou doubles), les $variables de démarrage, les substitutions arithmétiques, les contre-indications, etc. seront développées dans le document here. C'est un peu différent des documents ici en perl, où seuls les guillemets simples empêcheront les expansions de variables.
Une façon est d'utiliser le -spour activer le traitement rudimentaire des commutateurs sur la ligne de commande perl et de là définir un guillemet simple:
$ perl -spi -e '$_ .= qq/define(${q}SOMETHING$q, true);/' -- -q=\' file