我想在名为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)
}
答案 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)中的任何一个,请确保对它们进行转义,除非您希望将其作为正则表达式处理。
转义由\
完成,因此\[
。