问题
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