Comment échapper à 'inside' en perl?

Oct 29 2020

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

10 ilkkachu Oct 29 2020 at 06:23

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.)

5 user414777 Oct 29 2020 at 06:43

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.

2 RakeshSharma Oct 29 2020 at 22:13

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