sed - Piping a string before the last line in a file

青春壹個敷衍的年華 提交于 2020-08-02 13:12:49

问题


I have a command that prints a single line. I want to add/pipe this line to a file, just above its last line.

my_cmd | sed -i '$i' test

I just find an empty line in the correct place, above the last line. I notice that when I add any string as '$i foo', the "foo" gets printed in the correct place, but I want the piped line to be printed.

How can I use STDIN instead of "foo"?


回答1:


this should do the trick:

 sed -i "\$i $(cmd)" file

test:

kent$  cat f
1
2
3
4
5

kent$  sed -i "\$i $(date)" f

kent$  cat f
1
2
3
4
Tue Sep 30 14:10:02 CEST 2014
5



回答2:


Instead of passing your output to sed via pipe, you can use command substitution instead:

$ cat f
First line
Second line
Third line

$ sed -i '$i'"$(echo 'Hello World')" f
$ cat f
First line
Second line
Hello World
Third line

So in your case you can use:

sed -i '$i'"$(my_cmd)" test



回答3:


The other answers should work too.

Here is another approach, which uses a syntax similar to your code snippet and is free from shell injection exploits.

$ seq 1 5 > test.input
$ echo hello/world | sed '${x;s/.*/cat/e;p;x}' test.input
1
2
3
4
hello/world
5

PRO: This solution is protected from shell injection exploits.

CON: This is a GNU sed specific answer. So it may not be portable.



来源:https://stackoverflow.com/questions/26120345/sed-piping-a-string-before-the-last-line-in-a-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!