【问题标题】:Why a linux redirect truncates the file?为什么 linux 重定向会截断文件?
【发布时间】:2012-05-30 10:03:06
【问题描述】:

我有一个类似“test.txt”的文件:

hello world

它只是一个“hello world”字符串。如果我使用 perl 正则表达式:

perl -pe "s/hello/bye/g" test.txt

上面写着:

bye world

但如果我尝试将该文件重定向到自身:

perl -pe "s/hello/bye/g" test.txt > test.txt

结果文件为空。为什么?以及如何对文件“过滤”正则表达式?

【问题讨论】:

    标签: linux shell command-line


    【解决方案1】:

    perl 接受参数-i 就地。这样,您可以使用 perl 程序处理文件并立即将其写回。

    【讨论】:

    • @Ivan -i的参数只是备份的扩展名,所以你可以省略它或取一些简单的东西,例如~.bak
    【解决方案2】:

    由于重定向,它会在应用程序有机会读取文件之前打开文件进行写入。而是重定向到一个临时文件,然后重命名它。

    【讨论】:

    • 澄清一下,打开文件进行写入的效果之一是文件被截断(其大小更改为长度为零),因此在应用程序打开它时它是空的。
    【解决方案3】:

    重定向发生在您的 shell 解析命令行时。这发生在实际命令执行之前,因此您重定向到的文件在您有机会阅读之前被覆盖。

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 2016-12-29
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多