具体来说,我在自定义别名中使用>>
和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方法可以合并吗?
答案 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
我不知道你为什么要这样做。非常标准的是,这样的日志后来的条目出现在文件的后面。