gpt4 book ai didi

perl - 在进行搜索时保​​留时间戳,并使用 perl 替换多个文件

转载 作者:行者123 更新时间:2023-12-02 05:44:59 27 4
gpt4 key购买 nike

我经常用

perl -pi -w -e 's/search/replace/g;' [filelist]

在 [filelist] 的所有文件中用“replace”替换“search”的每个出现。不幸的是,所有文件似乎都有更新的时间戳。即使文件中没有出现“搜索”。我可以用一种简单的方法改变它吗?

最佳答案

-i 是松散的:

rename($ARGV, "$ARGV$^I") or die $! if length $^I;
open(*ARGV, '<', "$ARGV$^I") or die $!;
open(*STDOUT, '>', $ARGV) or die $!;

如您所见,它总是立即替换现有文件。这是所有打印 (-p) 发送输出的地方。

两种选择:

  1. 使用临时文件。

    perl -e'
    $temp_qfn = "temp";
    open(my $fh_out, ">", $temp_qfn) or die $!;
    my $save;
    while (<>) {
    $save = 1 if s/search/replace/g;
    print($fh_out $_);
    } continue {
    if (eof) { # Not eof()!
    close($fh_out);
    rename($temp_qfn, $ARGV) if $save;
    $save = 0;
    open(my $fh_out, ">", $temp_qfn) or die $!;
    }
    }

    close($fh_out);
    unlink($temp_qfn);
    ' file ...
  2. 将整个文件加载到内存中。

    perl -0777ne'
    if (s/search/replace/g) {
    open(my $fh_out, ">", $ARGV) or die $!;
    print($fh_out $_);
    }
    ' file ...

(以上两者都有各种可解决的错误处理问题。-i 也有一些相同的问题。)

关于perl - 在进行搜索时保​​留时间戳,并使用 perl 替换多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400616/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com