Supposons que j'ai un fichier qui a ces quelques lignes
Hello abc hii how are you Hello xyz
Si je veux remplacer la 2ème occurrence de abc par xyz, comment puis-je faire?
Je veux une sortie comme
Hello abc hii how are you Hello abc
J'ai essayé de faire perl -pi -e 's / abc / xyz / if $. == 2 'nom de fichier
. Cela ne fonctionne pas pour moi. Quelqu'un peut-il m'aider?
3 Réponses :
Comptez le nombre de fois où abc
apparaît et sous si égal à 2:
perl -i -pe'$found++ if /abc/; s/abc/xyz/ if $found ==2' filename
Suppose que abc
n'apparaît qu'une fois par ligne.
Je l'ai fait sous forme de script. Le premier argument est le modèle, le second le remplacement, le troisième le nombre de répétitions et le quatrième le fichier, vous pouvez également omettre le fichier et insérer les données vÃa stdin.
#!/usr/bin/env perl use v5.28; my $patt = shift; my $rep = shift; my $nth = shift; my $reps = 0; while (<>) { $reps++ if /$patt/; s/$patt/$rep/ if (/$patt/ && $reps == $nth); print $_; }
perl -i -pe's/abc/ ++$count == 2 ? "xyz" : "abc" /eg' file This works even if abc appears more than once per line.
Merci ça marche. Si je veux ajouter ceci dans un script perl, cela ne fonctionne pas en mettant cette commande système à l'intérieur. J'essaye de faire comme ce système ("perl -i -pe's / abc / ++ $ count == 2?" Xyz ":" abc "/ eg 'file")
Peut-être que quelque chose comme
perl -0777 -pi -e's /^.*? Abc. *? \ Kabc / xyz / s 'filename
fera l'affaire.connexe: pour remplacer la nième occurrence par ligne, voir stackoverflow.com/questions/2555662/...