Unix:如何将输出预先添加到文件中?

时间:2011-10-18 12:12:03

标签: bash unix redirect tee

具体来说,我在自定义别名中使用>>tee的组合来将新的Homebrew更新存储在文本文件中,并在屏幕上输出:

alias bu="echo `date "+%Y-%m-%d at %H:%M"` \
    >> ~/Documents/Homebrew\ Updates.txt && \
    brew update | tee -a ~/Documents/Homebrew\ Updates.txt"

问题:如果我希望在我的文本文件中添加此输出,即放在文件的开头而不是将其附加到结尾,该怎么办?


Edit1 :正如有人在下面的答案中所述,使用临时文件可能是一个很好的方法,这至少对我有所帮助:

targetLog="~/Documents/Homebrew\ Updates.txt"
alias bu="(brew update | cat - $targetLog \
> /tmp/out1 && mv /tmp/out1 $targetLog \
&& echo `date "+%Y-%m-%d at %H:%M":%S` | \
cat - $targetLog > /tmp/out2 \
&& mv /tmp/out2 $targetLog)"

但问题是STDOUT的输出(以前通过tee实现),我不确定这个tempfile方法可以合并吗?

6 个答案:

答案 0 :(得分:13)

sed很乐意为您做到这一点,使用-i进行编辑,例如。

sed -i -e "1i `date "+%Y-%m-%d at %H:%M"`" some_file

答案 1 :(得分:8)

这可以通过创建输出文件来实现:

我们说我们在file.txt上有初始内容

echo "first line" > file.txt          
echo "second line" >> file.txt

所以,file.txt是我们的底部'文本文件。现在预先添加到一个新的'输出'文件

echo "add new first line" | cat - file.txt > output.txt # <--- Just this command

现在,输出具有我们想要的内容。如果您需要旧名称:

mv output.txt file.txt
cat file.txt

答案 2 :(得分:3)

使用bash工具修改输入文件的唯一简单和安全方法是使用临时文件,例如。 sed -i在幕后使用临时文件(但要健壮sed需要更多)。

使用的一些方法有一个微妙的“可以破坏东西”陷阱,而不是在真实的数据文件上运行命令,而是在符号链接上运行它(到你想要修改的文件)。除非正确照顾,否则这可能会破坏链接并将其转换为真实的文件,该文件接收mod并保留原始真实文件而不使用预期的mod并且没有符号链接(没有错误退出代码结果)

要使用sed来避免这种情况,您需要使用--follow-symlinks选项 对于其他方法,请注意它需要遵循符号链接(当您在这样的链接上行动时)
使用临时文件,rm temp file仅在“文件”不是符号链接时才有效。

一种安全的方法是使用 moreutils

包中的sponge
  

与shell重定向不同,海绵之前会吸收所有输入   开盘          输出文件。这允许构造从中读取的管道          并写入同一个文件。

sponge是处理此类情况的一种很好的通用方法。

以下是使用sponge

的示例
hbu=~/'Documents/Homebrew Updates.txt'
{ date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu"

答案 3 :(得分:2)

最简单的方法IMO将使用echo和cat:

echo "Prepend" | cat - inputfile > outputfile

或者您的示例基本上将tee -a ~/Documents/Homebrew\ Updates.txt替换为cat - ~/Documents/Homebrew\ Updates.txt > ~/Documents/Homebrew\ Updates.txt

编辑:正如hasturkun所述,这不起作用,请尝试:

echo "Prepend" | cat - file | tee file

但这不再是最有效的方式......

答案 4 :(得分:1)

试试这个http://www.unix.com/shell-programming-scripting/42200-add-text-beginning-file.html 没有直接的操作符或命令AFAIK.You使用echo,cat和mv来获得效果。

答案 5 :(得分:1)

{ date; brew update |tee /dev/tty; cat updates.txt; } >updates.txt.new
mv updates.txt.new updates.txt

我不知道你为什么要这样做。非常标准的是,这样的日志后来的条目出现在文件的后面。