2011-08-09 94 views
34

我想在名爲1_classification.dat,2_classification.dat等的所有文本文件中將單詞「藍色」替換爲「紅色」。我想編輯相同的文件,所以我試過這段代碼,但它不起作用。我哪裏錯了?如何在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激活就地編輯。文件備份使用.bak擴展
  • 的正則表達式替換作用在隱變量,它是該文件的內容,行由行
+6

雙引號如果命令在Windows – Zaid

+0

呀,或沒有引號下運行可言,如果代碼不包含空格。 – bart

+4

在參數中使用'*'globbing似乎不適用於Windows。 – TLP

10

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

呃什麼??

只是

s/blue/red/g; 

,或者,如果你堅持要用一個變量(使用$ _時,這是沒有必要的,但我只是想顯示正確的語法):

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

無的現有答案提供了一個完整的例子,說明如何在腳本中完成這項工作(而不是單行)。下面是我做的:

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); 
相關問題