如何将文本附加到文件?


109

在Linux中将文本附加到文件的最简单方法是什么?

我看了一下这个问题,但是可接受的答案使用了一个附加程序(sed),我相信应该有一个更简单的方法echo或类似方法。

Answers:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

本质上,您可以将所需的任何文本转储到文件中。CTRL-D发送文件结束信号,该信号终止输入并将您返回到Shell。


2
当文件需要root权限时该怎么办?
UselesssCat

2
@UselesssCat当出现“权限被拒绝”时,我会重新检查我正在运行的任何命令,然后使用sudo !!-执行带sudo前缀的最后一个命令。我最近发现这也适用于nanoetc(通过意外尝试nano nano auth...)
Sandra

如果您需要使用sudo或在脚本中使用它,请参阅下面我对这个已接受答案的跟进
user12345

4
我不知道猫可以这样用!就像写日记条目。还不知道ctrl -d做什么。谢谢!
houallet

1
@Sandra- !!以前没用过,太棒了。因此,我经常做类似的事情cat /var/log/apache/error.log并获得许可被拒绝。这也可以使用历史记录中的id来完成,例如sudo !1419,这将以1419sudo的形式在历史记录中的行处执行命令。
Cyclonecode

172

怎么样:

echo "hello" >> <filename>

使用>>运算符会将数据追加到文件末尾,而使用运算符将>覆盖文件内容(如果已存在)。

您也可以使用printf相同的方式:

printf "hello" >> <filename>

请注意,使用上述内容可能很危险。例如,如果您已经有一个文件,并且需要在文件末尾附加数据,而您忘记添加最后一个>文件,则文件中的所有数据都会被破坏。您可以通过noclobber在您的中设置变量来更改此行为.bashrc

set -o noclobber

现在,当您尝试执行此操作时echo "hello" > file.txt,将会收到警告语cannot overwrite existing file

要强制写入文件,您现在必须使用特殊语法:

echo "hello" >| <filename>

您还应该知道,默认情况下echo会添加一个尾随换行符,可以通过使用-n标志来抑制它:

echo -n "hello" >> <filename>

参考文献


4
总的来说,我更喜欢使用此答案cat,而不是使用,但您最好确保使用>>而不是>
2013年

@ sixty4bit-完全同意,但是我认为您在使用shell时始终必须知道自己在做什么,否则您可能会执行sudo rm -r /=)
Cyclonecode

1
sudo rm -r /不是sudo rm -rf /!^ _ ^是否有一个标志会在用覆盖现有文件的内容之前要求确认>?始终使用这样的标志的别名似乎是个好主意。
sixty4bit

2
@ sixty4bit-您可以添加set -o noclobber您的内容,.bashrc然后您将不使用特殊语法就无法覆盖现有文件echo "hello" >| <filename>
Cyclonecode

您能否举一个例子来说明文件的名称,例如“ myFile.txt”之类的?我不确定您的示例中是<filename>还是filename
bharal

24

其他可能的方法是:

echo "text" | tee -a filename >/dev/null

-a将附加在文件的结尾。

如果需要sudo,请使用:

echo "text" | sudo tee -a filename >/dev/null

为什么在末尾> / dev / null?
Quadrivium

1
>/dev/null末防止“文本”,以在控制台上显示。
user9869932

13

跟踪接受的答案。

如果在脚本中使用结束符,则需要CTRL-D以外的其他东西来指定结束符。尝试以下方法:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

这会将文本追加到指定的文件(不包括“ EOF”)。

它利用了here文档(或heredoc)

但是,如果您需要sudo来附加到指定的文件,那么如果您直接在命令行上输入,则由于I / O重定向,在使用heredoc时会遇到麻烦。

当您直接在命令行上键入时,此变体将起作用:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

或者您也可以使用它tee来避免在将heredoc与cat一起使用时出现命令行sudo问题:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

我已经使用cat << 'EOF' >多年了,不知道cat << 'EOF' >>要追加!谢谢
FreeSoftwareServers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.