可能的重复:
IO重定向和head命令
我只想删除文件中除第一行之外的所有内容。我这样做了:
head -1 foo.txt
...并验证我只看到了第一行。然后我做了:
head -1 foo.txt > foo.txt
但现在不再只包含第一行,而是foo.txt
空的。
事实证明这cat foo.txt > foo.txt
也清空了文件。
为什么?
答案1
在 shell 开始处理任何数据之前,它需要确保所有输入和输出都已平方。
因此,在您的情况下,使用> foo.txt
基本上告诉系统:“创建一个名为的(新)文件foo.txt
并将该命令的所有输出粘贴到该文件中”。
正如您所发现的,问题在于这会清除以前的内容。
相关,>>
将附加到现有文件。
更新:
这是使用的解决方案sed
,请小心处理:
sed -i '2,$d' foo.txt
它将删除第 2 行到“最后”到位在文件中foo.txt
。最好先在一个你能承受得起搞乱的文件上尝试一下:)
该命令的这个稍微修改的版本将保留原始版本的副本,.bak
扩展名:
sed -i.bak '2,$d' foo.txt
您可以在命令行开关后指定任何字符序列(或单个字符)-i
作为“备份”(即原始)文件的名称。
答案2
因为您用来调用的 shellcat
会执行由 指示的重定向>
。
shell(bash、zsh、ksh、dash 等)读取命令cat foo.txt > foo.txt
。 shell 必须设置由 指示的重定向> foo.txt
。 >
意味着从顶部开始写入文件,>>
意味着附加到 foot.txt。
当 shell 实际cat
运行时,foo.txt 已经消失了。