为什么将文件“cat”到自身中会擦除它?

Nat*_*ong 12 cat head stdout

可能重复:
IO 重定向和 head 命令

我只想删除文件的第一行以外的所有内容。我这样做了:

head -1 foo.txt
Run Code Online (Sandbox Code Playgroud)

...并确认我只看到了第一行。然后我做了:

head -1 foo.txt > foo.txt
Run Code Online (Sandbox Code Playgroud)

但不是只包含第一行,foo.txt现在是空的。

事实证明,这cat foo.txt > foo.txt也清空了文件。

为什么?

Lev*_*von 13

在 shell 开始处理任何数据之前,它需要确保所有的输入和输出都是平方的。

因此,在您的情况下,使用> foo.txt基本上告诉系统:“创建一个名为的(新)文件并将foo.txt此命令的所有输出粘贴到该文件中”。

问题是,正如您发现的那样,这会清除以前的内容。

相关,>>附加到现有文件。

更新

这是使用sed, 小心处理的解决方案:

 sed -i '2,$d' foo.txt
Run Code Online (Sandbox Code Playgroud)

它会删除线2到“最后”就地文件foo.txt。最好先在一个你能负担得起的文件上试试这个:)

这个稍微修改过的命令版本将保留一个带有.bak扩展名的原始副本:

 sed -i.bak '2,$d' foo.txt
Run Code Online (Sandbox Code Playgroud)

您可以在-i命令行开关后为“备份”(即原始)文件的名称指定任何字符序列(或单个字符)。