2011-08-09 8 views
34

1_classification.dat、2_classification.datという名前のすべてのテキストファイルで、 "blue"という単語を "red"に置き換えたいとします。私は同じファイルを編集したいので、このコードを試しましたが、うまくいきません。どこが間違っていますか?Perlで既存のファイルの文字列を置き換えるには?

@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) 
} 

答えて

92

ワンライナーで何か問題がありますか?

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

説明

  • -p工程、次いでインプレース編集をアクティブライン
  • -i
  • によって<>ラインを印刷します。ファイルは、ライン・バイ・ライン
+6

二重引用符をコードにスペースが含まれていない場合、コマンドは、まったくのWindows – Zaid

+0

うん、または引用符なしの下で実行されている場合:ここで私がやったことです。 – bart

+4

引数で '*' globbingを使うことは、ウィンドウではうまくいかないようです。 – TLP

10

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

ええと、.bak延長

  • ファイルの内容は、暗黙的な変数の正規表現置換の行為を、使用してバックアップされています何??

    だけ

    s/blue/red/g; 
    

    か、あなたは($ _を使用する場合には不要であるが、私はちょうど右の構文を表示する)変数を使う、という場合:

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

    なしここでの既存の回答の中には、スクリプト内でこれを行う方法の完全な例が提供されています(1回限りではありません)。

    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); 
    
    関連する問題