在不将文件作为字符串读取的情况下查找和替换文件

时间:2012-08-30 23:50:56

标签: perl file replace

我的问题:如果我的PERL脚本被调用,C:\text_file.txt包含文本“Hello World World”,那么我在命令行上将text_file.txt作为参数世界“,我如何用”地球“取代所有”世界“的实例?

我是PERL的新手。我正在编写一个接受文件路径参数的脚本。我想对文件的内容进行查找替换。我知道我可以做这样的事情:$string =~ s/World/Earth/g;但我不想把文件读成字符串,如果我能帮忙的话。有没有办法直接在文件上执行此操作而不将其作为字符串读取?谢谢!

1 个答案:

答案 0 :(得分:3)

这是Perl的-i(" inplace edit")开关适用于:

$ perl -i.bak -pe 's/World/Earth/g' text_file.txt

编辑:将相同的功能合并到更大的Perl脚本中:

{
    local $^I = '.bak';
    local @ARGV = ('text_file.txt');
    local $_;
    while (<>) {
        s/World/Earth/g;
        print;
    }
}

$^I变量反映了-i命令行开关的值;在这里,它是手动设置的。此外,@ARGV正在手动设置为通常从命令行获取的文件列表。整个事情被包裹在一个块中,以便$^I@ARGV设置为local,之后恢复原始值;这可能不是绝对必要的,这取决于程序的其余部分。我还对$_进行了本地化,以保持while循环不会破坏之前持有的值;这也可能没有必要。

请注意,如果要避免创建备份文件,可以从命令行使用-i而不是-i.bak。相应的代码为$^I = "",而不是$^I = '.bak'