![sed,在最后一行之前插入文件](https://linux22.com/image/1415113/sed%EF%BC%8C%E5%9C%A8%E6%9C%80%E5%90%8E%E4%B8%80%E8%A1%8C%E4%B9%8B%E5%89%8D%E6%8F%92%E5%85%A5%E6%96%87%E4%BB%B6.png)
以下插入文件的方法曾经sed
有效,甚至在最后一行之前,但现在不再有效。这是当前的错误吗sed
?
使用sed插入文件方法的演示:
mkdir /tmp/test
printf '%s\n' {1..3} > /tmp/test/f1
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2
$ cat /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
1
2
3
nine
ten
$ head -9 /tmp/test/f2 | sed -e "/nine/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
1
2
3
$ cat /tmp/test/f2 | sed -e "/ten/r /tmp/test/f1" -e //N
one
two
three
four
five
six
seven
eight
nine
ten
1
2
3
$ sed --version
GNU sed version 4.2.1
...
即,在行前插入文件的方法在除最后一行之外的所有地方都有效。以前它一直有效。这是当前的错误吗sed
?
谢谢
答案1
既然你正在使用,gnu sed
你可以使用
'e [COMMAND]'
This command allows one to pipe input from a shell command into
pattern space.
在最后$
一行:
sed '$e cat insert.txt' file
使用ed
(如果想就地编辑,请替换,p
为):w
ed -s file<<IN
- r insert.txt
,p
q
IN
或者
ed -s file <<< $'-1 r insert.txt\n,p\nq\n'
ed
读取时file
将当前地址设置为最后$
一行。-
(或-1
)将当前地址设置为前一行(即$-1
)并r
读入insert.txt
当前行之后。,p
打印文本缓冲区的内容(正如我所说,用替换以w
保存更改)并q
退出编辑器。
答案2
根据您的评论,您“必须与最后一行匹配",所以我会考虑使用中的$
(最后一行)和i
(插入命令)sed
。例如:
sed '$ i\INSERT BEFORE LAST LINE' number.txt
1
2
3
4
INSERT BEFORE LAST LINE
5
只要确保文件的最后一行没有空行,它就可以正常工作。请注意美元符号和 之间的空格以及 后面的i
反斜杠 ( \
) i
。这会将反斜杠后的文本插入到最后一行,而无需/pattern/
为最后一行添加 。
注意:此命令只会在最后一行之前添加一行文本,而不是文件。如果您想在最后一行之前插入文件的内容。
如果您想添加整个文件(而您不知道它是否在sed
),我会使用以下命令:
head -n-1 first_file.txt && cat inserted_file.txt && tail -n1 first_file.txt
这应该显示除最后一行之外的所有内容,然后显示最后cat
一行。inserted_file.txt
first_file.txt