如何替换Perl中现有文件中的字符串?

时间:2011-08-09 10:45:25

标签: regex perl

我想在名为1_classification.dat,2_classification.dat等所有文本文件中将“blue”替换为“red”。我想编辑同一个文件,所以我尝试了这个代码,但它不起作用。我哪里错了?

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

4 个答案:

答案 0 :(得分:119)

单线是否有问题?

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

<强>解释

  • -p进程,然后逐行打印<>
  • -i激活就地编辑。使用.bak扩展名
  • 备份文件
  • 正则表达式替换作用于隐式变量,它是文件的内容,逐行

答案 1 :(得分:11)

这里没有现有的答案提供了一个完整的例子,说明如何在脚本(不是单行)中执行此操作。这是我做的:

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);

答案 2 :(得分:10)

  

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

呃,什么?

只是

s/blue/red/g;

或者,如果你坚持使用变量(使用$ _时不需要,但我只想显示正确的语法):

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

答案 3 :(得分:0)

可以用一行完成:

perl -pi.back -e 's/oldString/newString/g;' inputFileName

请注意,oldString被作为Regular Expression处理。
如果字符串包含{}[]()^$.|*+?The special characters for Regular Expression syntax)中的任何一个,请确保对它们进行转义,除非您希望将其作为正则表达式处理。
转义由\完成,因此\[