无法使用输出重定向覆盖现有文件 >

Posted

技术标签:

【中文标题】无法使用输出重定向覆盖现有文件 >【英文标题】:Unable to overwrite exiting file using output redirection > 【发布时间】:2020-10-10 11:46:46 【问题描述】:

存在名为 start.txt 的文件。 我正在使用一个 perl 命令,它使用 start.txt 的内容提供修改后的输出,我试图将修改后的输出覆盖到同一个文件

cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> start.txt

由于某种原因,运行上述命令会使文件 start.txt 为空

我的命令没有问题,因为如果我创建一个新文件来重定向输出,例如..

cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> test.txt

这完美地保存了 test.txt 中的预期输出,但我不想创建额外的文件,我需要覆盖现有文件本身。

我在阅读 &gt;| 后尝试了它用于强制覆盖文件,但仍然是同样的问题。 我什至试过| tee start.txt,仍然导致文件变空。

附带说明:我使用了一些 awk 命令,如果我尝试将输出保存/重定向到 awk 函数从中读取文本的文件中,则会导致输出文件为空的相同问题 如果有人问,我也会粘贴 awk 命令,尽管我认为会有一个通用的解决方案

【问题讨论】:

我建议不要写入你正在读取的文件,它会破坏文件。 看看 perl 的 -i 选项。 @Cyrus 谢谢我现在明白了这个问题 How can I use a file in a command and redirect output to the same file without truncating it? 的副本 @oguzismail 很好,接受的答案肯定会达到我的目的,谢谢分享 【参考方案1】:

此命令中空文件的原因

cat start.txt | perl -ne 'print "$1-$1.mp4 Lecture $2 -\n" while /.*\/videos\/(.*?mp4).*?(?<= )(\d+)/g;'> start.txt

> start.txt

位。

当您将命令输入到 shell 时,shell 会解析它并准备运行。它创建未命名管道以将catperl 通信,它还打开输出文件,截断它,并将perl 标准输出重定向到文件。最后,既然所有需要的重定向都已就位,它会启动不同的命令。 catperl 在这种情况下。但是cat 将要读取的文件已经被您要求 shell 执行的重定向截断了。

正如评论中已经指出的那样,最好的办法是避免写入您正在读取的同一文件。

【讨论】:

。我记得我不得不问的一件非常小的事情,它也与这个问题远程相关,linux中是否有任何命令可以清除文件中的所有文本,而不是删除文件,而只是删除其文本/内容? 你刚刚用过!你所有麻烦的根源:&gt; file_to_clear 谢谢,尽管出于某种原因,这样做会导致我的终端卡住,但 - : &gt; file_to_clear 立即工作 @Sachin 另请参阅truncate 实用程序。 @ikegami 感谢您的建议,我会检查 perl -i 和 truncate 实用程序

以上是关于无法使用输出重定向覆盖现有文件 >的主要内容,如果未能解决你的问题,请参考以下文章

LINUX-IO重定向

Linux高级-基本命令-笔记

3.管道符重定向与环境变量

无法使用 nmake 将重定向符号 (>>) 写入文本文件

linux中的管道和重定向

关于shell输入 输出重定向