14

具体来说,我使用>>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 实现),我不确定是否可以将其合并到这种临时文件方法中……?

4

6 回答 6

15

sed 会很乐意为您执行此操作,用于-i就地编辑,例如。

sed -i -e "1i `date "+%Y-%m-%d at %H:%M"`" some_file
于 2011-10-18T12:27:12.093 回答
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
于 2014-07-22T16:10:38.667 回答
5

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

使用的一些方法有一个微妙的“可以破坏事物”陷阱,而不是在真实数据文件上运行命令,而是在符号链接上运行它(指向您打算修改的文件)。除非得到正确处理,否则这可能会破坏链接并将其转换为接收 mod 的真实文件并留下原始真实文件而没有预期的 mod 和符号链接(没有错误退出代码结果)

为了避免这种情况sed,您需要使用该--follow-symlinks选项。
对于其他方法,请注意它需要遵循符号链接(当您对此类链接采取行动时)
使用临时文件,然后rm temp file仅当“文件”不是符号链接时才有效。

一种安全的方法是使用spongemoreutils

与 shell 重定向不同,海绵在打开输出文件之前会吸收所有输入。这允许构建读取和写入同一文件的管道。

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

这是一个例子,使用sponge

hbu=~/'Documents/Homebrew Updates.txt'
{ date "+%Y-%m-%d at %H:%M"; cat "$hbu"; } | sponge "$hbu"
于 2011-10-18T13:50:49.650 回答
2

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

echo "Prepend" | cat - inputfile > outputfile

或者对于您的示例,基本上替换tee -a ~/Documents/Homebrew\ Updates.txtcat - ~/Documents/Homebrew\ Updates.txt > ~/Documents/Homebrew\ Updates.txt

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

echo "Prepend" | cat - file | tee file

但这不再是最有效的方法了......

于 2011-10-18T12:30:58.843 回答
1

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

于 2011-10-18T12:19:43.893 回答
1
{ date; brew update |tee /dev/tty; cat updates.txt; } >updates.txt.new
mv updates.txt.new updates.txt

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

于 2011-10-18T20:48:39.797 回答