Regex 如何在Perl中替换现有文件中的字符串
我想在所有名为1_classification.dat、2_classification.dat等的文本文件中,将单词“blue”替换为“red”。我想编辑同一个文件,所以我尝试了以下代码,但它不起作用。我哪里做错了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
@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中,我必须在regexglob
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);