如何在 Bash 中将文本添加到文件开头?

如何在 Bash 中将文本添加到文件开头?

你好,我想在文件前面添加文本。例如,我想将任务添加到 todo.txt 文件的开头。我知道,echo 'task goes here' >> todo.txt但这会将行添加到文件末尾(这不是我想要的)。

答案1

Linux:

echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

或者

sed -i '1s/^/task goes here\n/' todo.txt

或者

sed -i '1itask goes here' todo.txt

Mac OS X:

sed -i '.bak' '1s/^/task goes here\'$'\n/g' todo.txt

或者

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

或者

echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt

答案2

我认为一个更简单的选择是:

echo -e "task goes here\n$(cat todo.txt)" > todo.txt

$(...)这是因为在执行之前执行的命令todo.txt被覆盖为> todo.txt

虽然其他答案也很好,但我发现这个更容易记住,因为我每天都使用 echo 和 cat。

编辑:如果 中有反斜杠,则此解决方案非常糟糕todo.txt,因为多亏了-e标志,echo 会解释它们。将换行符放入前言字符串的另一种更简单的方法是...

echo "task goes here
$(cat todo.txt)" > todo.txt

...只需使用换行符即可。当然,它不再是一行代码了,但实际上它以前也不是一行代码。如果您在脚本中执行此操作,并且担心缩进(例如,您在函数中执行此操作),则有一些解决方法可以使其仍然很好地适合,包括但不限于:

echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt

另外,如果你关心是否在 的末尾添加了换行符todo.txt,请不要使用这些。好吧,除了倒数第二个。这不会影响结尾。

答案3

moreutils有一个很好的工具叫做sponge

echo "task goes here" | cat - todo.txt | sponge todo.txt

它会“吸收” STDIN,然后写入文件,这意味着您不必担心临时文件和移动它们。

您可以moreutils通过许多 Linux 发行版获取,apt-get install moreutils或者在 OS X 上使用自制, 和brew install moreutils

答案4

您可以创建一个新的临时文件。

echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt

您也可以使用sedawk。但基本上会发生相同的事情。

相关内容