我可以cat file.txt
获取文件的内容,但我还想添加我自己选择的最后一行。
我尝试过管道(cat file.txt ; echo "My final line") |
,但只有最后一根管线穿过了管道。我该如何连接管道和最后一根管线?
编辑以澄清一点:我不希望修改文件本身。我知道如果是这种情况,我可以执行echo "My final line" >> file.txt
或,echo "My final line" | tee -a file.txt
但我只想尝试在此特定命令的上下文中执行附加操作,以便我可以通过管道连接file.txt
和"My final line"
。
答案1
您可以利用cat
从标准输入读取的能力以及读取多个文件的能力来实现这一点。
~$ cat file.txt
Hello from file.txt
~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line
您还可以添加一行,例如:
~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt
请注意,您不限于一行。cat
将从 stdin 读取,直到到达 EOF。curl
例如,您可以将 的输出传递到 的输出前面或后面cat
。
~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre> * <----- vous êtes ici</pre></strong></body></html>
答案2
要将一行附加到文件,您只需使用 shell 附加重定向运算符即可>>
(文件将使用标志open(2)
附加O_APPEND
):
echo 'My final line' >>file.txt
现在,如果你想看法文件内容加上最后一行,我会使用cat
两个参数:
- 首先,你的文件显然是
file.txt
- 第二个参数是您选择的字符串,要将该字符串作为文件名传递(因为
cat
仅处理文件),您可以利用进程替换,<()
它将返回一个文件描述符(/proc/self/fd/<fd_number>)
。
把它们放在一起:
cat file.txt <(echo 'My final line')
如果您希望对输出进行分页,假设less
是您最喜欢的分页器:
less file.txt <(echo 'My final line')
答案3
sed -e '$aMy final line' file.txt
从man sed
选项-e
-e script, --expression=script
add the script to the commands to be executed
$
匹配最后一行并 a
附加字符串。
如果你想永久地将该行附加到文件中,请使用-i
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
将命令更改为
sed -i -e '$aMy final line' file.txt
答案4
这里有很多不错的答案,但就我而言,我只想通过将命令附加到管道末尾来将换行符附加到某些 stdout。这实现了这一点:
$CMD_OR_COMMANDS | cat - <(echo)
为了符合原始示例:
cat file.txt | cat - <(echo "My final line")
这无疑是一种冗长的方式来完成这件事,但关键是这种模式可能更适合您的需求,因为它适用于任何产生标准输出的东西。