71 votes

Comment remplacer une chaîne dans un fichier existant en Perl

Je souhaite remplacer le mot "bleu" par "rouge" dans tous les fichiers texte nommés 1_classification.dat, 2_classification.dat et ainsi de suite. Je veux éditer le même fichier alors j'ai essayé le code suivant, mais cela ne fonctionne pas. Où vais-je mal?

 @files = glob("*_classification.dat");
foreach my $file (@files)
{
    open(IN,$file) or die $!;
    <IN>;
    while(<IN>)
    {
        $_ = '~s/blue/red/g';
        print IN $file;
    }
    close(IN)
}

158voto

Zaid Points 21192

Utilisez un one-liner :

 $ perl -pi.bak -e 's/blue/red/g' *_classification.dat

Explication

  • -p traite, puis imprime <> ligne par ligne
  • -i active l'édition sur place. Les fichiers sont sauvegardés à l'aide de l'extension .bak
  • La substitution regex agit sur la variable implicite, qui sont le contenu du fichier, ligne par ligne

18voto

cmbryan Points 35

Aucune des réponses existantes ici n'a fourni d'exemple complet de la façon de procéder à partir d'un script (pas d'une seule ligne). Voici ce que j'ai fait:

 rename($file, $file . '.bak');
open(IN, '<' . $file . '.bak') or die $!;
open(OUT, '>' . $file) or die $!;
while(<IN>)
{
    $_ =~ s/blue/red/g;
    print OUT $_;
}
close(IN);
close(OUT);

13voto

bart Points 3543

$_='~s/blue/red/g';

Hein??

Seulement

 s/blue/red/g;

ou, si vous insistez pour utiliser une variable (ce qui n'est pas nécessaire lors de l'utilisation de $_, mais je veux juste montrer la bonne syntaxe):

 $_ =~ s/blue/red/g;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X