【问题标题】: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 命令,尽管我认为会有一个通用的解决方案

【问题讨论】:

标签: bash perl unix


【解决方案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 实用程序
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多