-1
votes

Comment faire référence au modèle assorti dans la recherche Perl et à remplacer de la ligne de commande Bash?

Je veux faire de la recherche et de remplacer (foo to freobar) avec BASH à l'aide de Perl Commande: xxx

mais je ne sais pas toujours ce que je ne sais pas toujours ', donc je veux un type de chose variable qui stocke le motif correspondant.

Puis-je également obtenir une sous-chaîne du motif correspondant? Comme 'foo' est remplacé par 'oobar' (FOO devient OO)?


15 commentaires

Vous pouvez utiliser des variables dans votre regex, c'est-à-dire Stackoverflow.com/questions/4616395/...


Pourriez-vous s'il vous plaît expliquer davantage "Puis-je également obtenir une sous-chaîne du modèle correspondant? Comme" FOO "est remplacé par" Oobar "(FOO devient OO)?" ? pas vraiment sûr de ce que vous voulez exactement


Pourriez-vous donner un exemple dans une commande bash? Je ne sais pas Perl.


@Chris suppose que je puisse faire référence au modèle correspondant "FOO" par, disons, $ var, je veux obtenir une sous-chaîne de $ var (comme substrub ($ var, 1)) qui sera "OO", alors enfin je Peut remplacer chaque instance de "foo" avec "oobar". Ici, je reçois "OO" de la sous-chaîne du modèle assorti "FOO" et je fournis la "barre".


Essayez sudo perl -i -0777 -Pe "S / $ FOO / $ {FOO: 1} bar / gs" A.txt ou avec SED , sudo Sed -i "S / $ FOO / $ {FOO: 1} bar / g" A.txt


@ Wiktorstribiżew est $ FOO une variable ou modèle? Enfait, j'ai un motif complexe pour correspondre: [^ u] "une chaîne" .Format et reportez-vous à sa sous-chaîne dans le champ de remplacement.


Vous n'avez pas besoin [^ u] , utilisez (? à la place. sudo perl -i -pe 's / (? ou quel que soit le remplacement dont vous avez besoin, $ et est l'ensemble de la correspondance.


Bien sûr, ce ne serait pas, vous avez ruiné toute la syntaxe. Remarque J'ai suggéré -0777 uniquement parce que vous avez le modificateur S , mais à partir de ce que vous semblez vouloir correspondre, vous n'avez besoin de ni d'entre eux.


Vous devez ré-écrire toute la question si vous voulez que je pose une réponse cohérente. Je ne sais pas tout à fait ce qui fonctionne pour vous, mais vous avez probablement obtenu l'essentiel de l'utilisation d'une lunette d'apparence négative au lieu d'une classe de caractère niée.


@ Wiktorstribiżew j'ai fait sudo perl -i -0777 -pe s / '(? a = "vs" + "aa {}". format ("CVS") mais il n'a pas fonctionné


Que voulez-vous faire avec a = "vs" + "aa {}". Format ("CVS") ? quel est le résultat attendu? Pourquoi?


Le résultat attendu est a = "vs" + u "aa {}". Format ("CVS") . Exécuter la commande à nouveau ne doit pas insérer une autre "U".


@ Wiktorstribiżew Je souhaitais que je voulais des regards négatifs parce que je ne veux pas correspondre à ces fonctions de format avec un "U" déjà présent.


Vous pouvez probablement peut-être même utiliser sed : SED -I -E 'S / (^ | [^ u]) ("[^"] * "\.) / \ 1U \ 2 / g 'abc.txt . Cela pourrait ne pas fonctionner cependant avec ur "..." , r' ... ' etc. .


@ Wiktorstribiżew man Ça a finalement travaillé! Je n'utilise pas SED parce que je veux un match multiligne. Et j'avais manqué * après [^ "]


3 Réponses :


1
votes

Utilisez le modificateur d'évaluation d'expression E code> .

perl -0777 -i -pe's/(foo)/substr($1, 1) . "bar"/egs' a.txt


1 commentaires

Cela ne fonctionnera finalement pas parce qu'il va couper et jeter le premier caractère du match. OP est un problème xy.



1
votes

$ & fait référence à l'ensemble du motif correspondant et au lieu de prendre la sous-chaîne de celle que j'ai utilisé LookeDeHind (? Cela signifie n'importe quel caractère que u : xxx

Ceci correspondra non seulement à tout foo mais n'importe quelle occurrence de oo mais jamais uoo et le remplacer par uoobar .


0 commentaires

1
votes

Dans l'exemple que vous avez donné, vous n'avez pas besoin d'utiliser le texte correspondant.

perl -pe's/foo/ substr($&,0,1)."oobar" /eg'


2 commentaires

Le modèle réel contient. Et je veux couvrir les lignes. Et je suis juste à l'aise avec ces citations: p


Les citations ne demandent que des problèmes. Ils réduisent la lisibilité et la maintenabilité. Pire, ils sont trompeurs.