【问题标题】:Find and replace in a file without reading file as a string在文件中查找和替换而不将文件作为字符串读取
【发布时间】:2012-08-25 18:57:01
【问题描述】:

我的问题:如果在调用我的 PERL 脚本时在命令行中将 C:\text_file.txt 作为参数,并且 text_file.txt 包含文本“Hello World World World”,如何用“地球”替换所有“世界”实例?

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

【问题讨论】:

  • 您总是将文件读入字符串。虽然,不一定是一次性的。一次一行就可以了。
  • 我意识到这一点。我只是想抽象它,所以我不必担心它。我正在寻找一种 PERL 已经具备的内置方式。

标签: perl file replace


【解决方案1】:

这就是 Perl 的 -i(“就地编辑”)开关的用途:

$ 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'

【讨论】:

  • 如何将它添加到 PERL 脚本中? (就像我说的,我很新)
  • 在这种情况下,s/World/Earth/g Perl 脚本。
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多