一行代码中的 `tail` 和 append

一行代码中的 `tail` 和 append

在 Bash 中,怎样才能tail将文本附加到文件中的一行中?

我的失败尝试是

tail file.txt > file.txt && date >> file.txt

答案1

这会产生意想不到的结果:

tail file.txt > file.txt && echo $(date) >> file.txt

第一个重定向会截断文件tail 进程启动,因此 tail 现在正在对一个空文件进行操作。(參考

2条建议:

  1. 一个临时文件:

    f=file.txt
    tmp=$(mktemp)
    { tail "$f"; date; } > "$tmp" && mv "$tmp" "$f"
    
  2. sponge来自更多工具包裹

    f=file.txt
    { tail "$f"; date; } | sponge "$f"
    

请注意这echo $(date)是多余的:您不需要echo将输出发送date到标准输出——date默认情况下会这样做。

答案2

另一种不使用临时文件或安装额外工具的方法(但对于大文件效率不高):

<<<"$(<file)" tail >file && date >>file

这将读取命令替换,保证在解析其他重定向之前进行file读取。file

答案3

你可以在 Ex 模式下使用 Vim:

ex -sc '1,-10d|x' file.txt
  1. 1,-10选择除最后 10 行以外的所有行

  2. d删除

  3. x保存并关闭

相关内容