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

use*_*579 50 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)
}
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 123

单线有什么问题吗?

$ perl -pi.bak -e 's/blue/red/g' *_classification.dat
Run Code Online (Sandbox Code Playgroud)

说明

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

  • 如果命令在Windows下运行,则引用双引号 (8认同)
  • 在参数中使用`*`globbing似乎在Windows中不起作用. (4认同)
  • 我注意到在 Windows 上我必须在正则表达式周围使用双引号 (2认同)

小智 12

这里没有现有的答案提供了如何从脚本(不是单行)中完成此操作的完整示例.这是我做的:

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);
Run Code Online (Sandbox Code Playgroud)

  • 丑陋地滥用 $_ (4认同)

bar*_*art 11

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

呃,什么?

只是

s/blue/red/g;
Run Code Online (Sandbox Code Playgroud)

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

$_ =~ s/blue/red/g;
Run Code Online (Sandbox Code Playgroud)