代码之家  ›  专栏  ›  技术社区  ›  Zaid

为什么在使用ActivePerl时必须用备份扩展名指定-I开关?

  •  22
  • Zaid  · 技术社区  · 16 年前

    C:\> perl -i -ape "splice (@F, 2, 0, q(inserted text)); $_ = qq(@F\n);" file1.txt
    Can't do inplace edit without backup.
    

    同一命令 -i.bak 或 -i.orig 工作一个处理,但在这个过程中创建一个不需要的备份文件。

    有办法吗?

    2 回复  |  直到 14 年前
        1
  •  35
  •   rjh    16 年前

    这是Windows/MS-DOS限制。根据 perldiag :

    Perl的 -i file1.txt 同时保持打开的句柄,然后用相同的名称重新创建文件。这允许您“读取”file1.txt,即使它已被删除并正在重新创建。不幸的是,Windows/MS-DOS不允许删除附加了打开句柄的文件,因此此机制不起作用。

    -i.bak 然后删除备份文件。这至少为您提供了一些保护—例如,如果需要,您可以选择不删除备份 perl 退出代码为非零。比如:

    perl -i.bak -ape "splice...." file1.txt && del file1.bak
    
        2
  •  0
  •   shuckc    11 年前

    $ find . -name "*.xml" -print0 | xargs -0 perl -p -i.bak -e 's#\s*<property name="blah" value="false" />\s*##g'
    $ find . -name "*.bak" -print0 | xargs -0 rm
    

    在find/xarg之间传递以二进制结尾的值以处理空格。不寻常的s/前缀,以避免在搜索词中损坏xml。假设你没有 .bak