En perl, la référence arrière en remplacement de texte suivie par le numérique littérale
J'ai de la difficulté avec une référence arrière dans mon texte de remplacement qui est suivi par un littéral. J'ai essayé ce qui suit:
perl -0pi -e "s/(<tag1>foo<\/tag1>\n\s*<tag2>)[^\n]*(<\/tag2>)/${varWithLeadingNumber}/" file.xml
perl -0pi -e "s/(<tag1>foo<\/tag1>\n\s*<tag2>)[^\n]*(<\/tag2>)/\g{1}${varWithLeadingNumber}\g{2}/" file.xml
Le premier, bien entendu, les causes des problèmes parce que ${varWithLeadingNumber} commence par un nombre, mais je pensais que le \g{1}
construire dans ma deuxième tentative au-dessus de était censé résoudre ce problème. Je suis à l'aide de perl 5.12.4.
- Êtes-vous sûr que votre problème n'est pas avec le shell? J'aimerais placer le script dans des guillemets simples, sauf pour la partie collecte les variables shell, juste de couper vers le bas sur le nombre de barres obliques inverses à s'inquiéter.
- Je l'ai juste essayé, par exemple,
perl -0pi -e 's/(<tag1>foo<\/tag1>\n\s*<tag2>)[^\n]*(<\/tag2>)/\g{1}25\g{2}/' file.xml
, et le résultat était le même. Le texte de remplacement finit par êtreg{1}25g{2}
.
Vous devez vous connecter pour publier un commentaire.
À l'aide de
\1
,\2
, etc dans le remplacement de l'expression est fausse.\1
est un modèle d'expression régulière qui signifie "correspondent à ce que la première capture d'appariement" qui n'a pas de sens en un remplacement de l'expression. Les modèles d'expression régulière ne doit pas être utilisé en dehors des expressions régulières!$1
,$2
, etc est ce que vous devriez être en utilisant il.Après la fixation de
\1
, vous avezCela dit, je pense que
varWithLeadingNumber
est censé être une variable d'environnement? Vous ne devriez pas avoir de problèmes si c'est une variable Perl. Si vous avez le shell interpolervarWithLeadingNumber
, le problème peut être résolu en utilisantNoter que vous aurez des problèmes si $varWithLeadingNumber contient "$", "@", "\" ou "/", de sorte que vous pourriez vouloir utiliser un argument de ligne de commande au lieu de l'interpolation.
Vous pouvez également utiliser une variable d'environnement.
ou
Si vous aviez une
\1
vous pouvez éviter le problème d'un certain nombre de façons, y compris
$varWithLeadingNumber
. Je recommande contre.