2010-09-28 8 views
0

J'ai un grand nombre de fichiers PHP et les lignes qui doivent être modifiés d'une syntaxe standard echo "string goes here"; à: custom_echo("string goes here");syntaxe Perl appropriée pour la substitution complexe

Ceci est la ligne que je suis en train de frapper En Perl pour accomplir ceci: perl -pi -e 's/echo \Q(.?*)\E;/custom_echo($1);/g' test.php Malheureusement, je fais une petite erreur de syntaxe, et cela ne modifie pas "test.php" dans le moins. Quelqu'un peut-il me dire comment y remédier?

+6

Perl n'est pas un acronyme. – Ether

+0

En fait, c'est un acronyme. Mais il est toujours orthographié 'Perl'. – mob

+5

En fait, ce n'est pas ** un acronyme. Mais il y a plusieurs backronyms. http://en.wikipedia.org/wiki/Perl#Name – Amadan

Répondre

4

Pourquoi ne pas simplement faire quelque chose comme:

perl -pi -e 's|echo (\".*?\");|custom_echo($1);|g' file.php 

Je ne pense pas \Q et \E font ce que vous pensez qu'ils font. Ils ne sont pas le début et la fin des citations. Ils sont dans le cas où vous mettez dans un caractère spécial regex (comme .) - si vous l'entourez par \Q ... \E alors le caractère regex spécial n'est pas interprété. En d'autres termes, votre expression régulière essaye de faire correspondre la chaîne littérale (.?*), que vous n'avez probablement pas, et ainsi les substitutions ne sont pas faites.

Vous avez également eu votre ? et * arrière - Je suppose que vous voulez faire correspondre non avidement, dans ce cas, vous devez mettre le ? comme modificateur non gourmand aux .* personnages.

Edit: Je suggère fortement de faire:

perl -pi.bak -e ... file.php 

Cela va créer un fichier "de sauvegarde" que le fichier original est copié à. Dans mon exemple ci-dessus, il va créer un fichier nommé file.php.bak qui contient le contenu d'origine, pré-substitution. Ceci est incroyablement utile pendant les tests jusqu'à ce que vous soyez certain que vous avez construit votre regex correctement. Enfer, le disque est bon marché, je suggère toujours en utilisant l'opérateur de ligne de commande -pi.bak.

+0

Merci! Exactement ce que je tentais d'atteindre. Et je rsync toujours mes données avant de faire des changements majeurs comme celui-ci. :) –

2

Vous mettez vos parenthèses de regroupement à l'intérieur de l'expression de métaquotation (\Q(pattern)\E) au lieu de dehors ((\Qpattern\E)), ainsi vos parenthèses sont également échappées et votre expression régulière ne capture rien.

+0

Avez-vous été à l'intérieur et à l'extérieur? – mkb

+0

Eh bien, c'est un problème de moins, mais je semble toujours avoir plus de problèmes. –

+0

@Matt Kane ne pense pas ... Je voulais dire ceci pour analyser "Vous les avez mis à l'intérieur, mais vous auriez dû les mettre dehors" – mob

Questions connexes