无法使用输出重定向覆盖现有文件 >
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 中的预期输出,但我不想创建额外的文件,我需要覆盖现有文件本身。
我在阅读 >|
后尝试了它用于强制覆盖文件,但仍然是同样的问题。
我什至试过| 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 会解析它并准备运行。它创建未命名管道以将cat
与perl
通信,它还打开输出文件,截断它,并将perl
标准输出重定向到文件。最后,既然所有需要的重定向都已就位,它会启动不同的命令。 cat
和 perl
在这种情况下。但是cat
将要读取的文件已经被您要求 shell 执行的重定向截断了。
正如评论中已经指出的那样,最好的办法是避免写入您正在读取的同一文件。
【讨论】:
。我记得我不得不问的一件非常小的事情,它也与这个问题远程相关,linux中是否有任何命令可以清除文件中的所有文本,而不是删除文件,而只是删除其文本/内容? 你刚刚用过!你所有麻烦的根源:> file_to_clear
谢谢,尽管出于某种原因,这样做会导致我的终端卡住,但 - : > file_to_clear
立即工作
@Sachin 另请参阅truncate
实用程序。
@ikegami 感谢您的建议,我会检查 perl -i 和 truncate 实用程序以上是关于无法使用输出重定向覆盖现有文件 >的主要内容,如果未能解决你的问题,请参考以下文章