2011-08-09 57 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); 
相关问题