2
votes

Comment résoudre ce problème de correspondance et de remplacer la seule nième occurrence d'un mot dans un fichier en perl

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?


2 commentaires

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/...


3 Réponses :


2
votes

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


1 commentaires

Suppose que abc n'apparaît qu'une fois par ligne.



0
votes

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 $_;
}


0 commentaires

3
votes
perl -i -pe's/abc/ ++$count == 2 ? "xyz" : "abc" /eg' file
This works even if abc appears more than once per line.

1 commentaires

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")