Je veux faire de la recherche et de remplacer (foo to freobar) avec BASH à l'aide de 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. P> Puis-je également obtenir une sous-chaîne du motif correspondant? Comme 'foo' est remplacé par 'oobar' (FOO devient OO)? P> P> Perl code> Commande:
3 Réponses :
Utilisez le modificateur d'évaluation d'expression E code>
.
perl -0777 -i -pe's/(foo)/substr($1, 1) . "bar"/egs' a.txt
Cela ne fonctionnera finalement pas parce qu'il va couper et jeter le premier caractère du match. OP est un problème xy.
Ceci correspondra non seulement à tout $ & code> 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 code>:
foo code> mais n'importe quelle occurrence de
oo code> mais jamais
uoo code> et le remplacer par
uoobar code>. p> p>
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'
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.
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 CODE> ou avec
SED code>,
sudo Sed -i "S / $ FOO / $ {FOO: 1} bar / g" A.txt code>
@ Wiktorstribiżew est $ FOO une variable ou modèle? Enfait, j'ai un motif complexe pour correspondre:
[^ u] "une chaîne" .Format code> et reportez-vous à sa sous-chaîne dans le champ de remplacement.
Vous n'avez pas besoin
[^ u] code>, utilisez
(? à la place.
sudo perl -i -pe 's / (? ou quel que soit le remplacement dont vous avez besoin,
$ et code> 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 code> uniquement parce que vous avez le modificateur
S code>, 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") code> mais il n'a pas fonctionné
Que voulez-vous faire avec
a = "vs" + "aa {}". Format ("CVS") CODE>? quel est le résultat attendu? Pourquoi?
Le résultat attendu est
a = "vs" + u "aa {}". Format ("CVS") code>. 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 code>:
SED -I -E 'S / (^ | [^ u]) ("[^"] * "\.) / \ 1U \ 2 / g 'abc.txt code>. Cela pourrait ne pas fonctionner cependant avec
ur "..." code>,
r' ... ' code> 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 [^ "]