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

Regex 如何在Perl中替换现有文件中的字符串,regex,perl,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&g

我想在所有名为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)
}
@files=glob(“*_classification.dat”);
foreach my$文件(@files)
{
打开(在$file中)或死亡$!;
;
while()
{
$\='~s/blue/red/g';
以$file打印;
}
关门
}
使用单衬里:

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

解释

  • -p
    处理,然后逐行打印
  • -i
    激活就地编辑。使用
    .bak
    扩展名备份文件
  • 正则表达式替换作用于隐式变量,隐式变量是文件的内容,逐行执行
$\='~s/blue/red/g'

嗯,什么

只是

或者,如果您坚持使用变量(在使用$\时,这不是必需的,但我只想显示正确的语法):


这里的现有答案都没有提供一个完整的示例,说明如何在脚本(不是一行代码)中实现这一点。以下是我所做的:

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);
rename($file,$file.'.bak');
打开(在、.$文件中)或死亡$!;
while()
{
$\uz=~s/blue/red/g;
打印出美元;
}
关闭(IN);
收尾;

可以使用一行代码完成:

perl-pi.back-e's/oldString/newString/g;'输入文件名
请注意,
oldString
被处理为一个字符串。
如果字符串包含任何
{}[]()^$.|*+?
()项,请确保将其转义,除非希望将其作为正则表达式处理。

转义是通过
\
完成的,因此
\[

是的,或者如果代码不包含空格,则根本不使用引号。在windows中使用
*
globbing参数似乎不起作用。我注意到,在windows中,我必须在regex
glob
hack周围使用双引号来支持通配符命令行参数(
*.dat
)对于Windows用户:
开始{@ARGV=map+glob,@ARGV}
如果搜索和替换字符串在变量中会发生什么?
perl-pi-e的/$oldKey/$trimmedNewKey/g'AppConstants.txt对我不起作用$_
$_ =~ s/blue/red/g;
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);