web-dev-qa-db-fra.com

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

Je veux remplacer Word "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, j'ai donc essayé ce code mais cela ne fonctionne pas. Où est-ce que je vais 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)
}
49
user831579

Quelque chose ne va pas avec une doublure?

$ 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 .bak extension
  • La substitution d'expression régulière agit sur la variable implicite, qui est le contenu du fichier, ligne par ligne
121
Zaid

Aucune des réponses existantes ici n'a fourni un exemple complet de la façon de procéder à partir d'un script (et non d'une 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);
12
cmbryan

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

Quoi??

Juste

s/blue/red/g;

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

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