Linux 在bash中将一个文本文件的内容插入到另一个文本文件中

Linux 在bash中将一个文本文件的内容插入到另一个文本文件中,linux,bash,sed,Linux,Bash,Sed,我想将一个文本文件(带换行符)的内容插入另一个文本文件的预定位置(在某个字符串之后): 我尝试了以下方法: 基本文件: cat base ONE TWO THREE 延长期限: cat ext 100 200 300 400 500 600 700 800 900 A00 B00 C00 D00 我试过的剧本: #!/bin/bash ext=$(<ext) sed -i "s/TWO/TWO\n$ext/" base #/bin/bash ext=$(如果您想e

我想将一个文本文件(带换行符)的内容插入另一个文本文件的预定位置(在某个字符串之后): 我尝试了以下方法: 基本文件:

cat base
ONE
TWO
THREE
延长期限:

cat ext
100
200
300
400
500
600
700
800
900
A00
B00
C00
D00
我试过的剧本:

#!/bin/bash
ext=$(<ext)
sed -i "s/TWO/TWO\n$ext/" base
#/bin/bash

ext=$(如果您想ed直接将其作为一个文件,我总是建议使用
ed
而不是非标准的
sed-I
(支持它的
sed
的不同实现的行为不同,这里有一个常见的问题来源):

将在base中包含两个的第一行之后插入文件ext的内容,然后将base的新版本写回磁盘

如果必须使用
sed
,则正确的调用看起来非常相似(这并不奇怪,因为它们是同级命令):

sed-i'/TWO/r ext'base
(这将在base中每两个文件之后插入ext文件,而不仅仅是第一个文件。)

两者的关键是
r
命令,该命令读取给定文件的内容,并将其插入到具有匹配地址的行后。这比尝试将文件内容读入变量并将文本直接包含在
ed
/
sed
命令中要好得多


如果要在行后插入变量的内容,可以使用

printf "%s\n" "/TWO/a" "$ext" . w | ed -s base
(只要变量没有一行只有一个句点)

或者使用GNU sed

sed -i "/TWO/a ${ext//$'\n'/\\\n}" base

a在地址行后添加文本。

如果您想ed直接将其作为文件,我总是建议
ed
而不是非标准的
sed-I
(支持它的
sed
的不同实现的行为不同,这是常见的问题来源):

将在base中包含两个的第一行之后插入文件ext的内容,然后将base的新版本写回磁盘

如果必须使用
sed
,则正确的调用看起来非常相似(这并不奇怪,因为它们是同级命令):

sed-i'/TWO/r ext'base
(这将在base中每两个文件之后插入ext文件,而不仅仅是第一个文件。)

两者的关键是
r
命令,该命令读取给定文件的内容,并将其插入到具有匹配地址的行后。这比尝试将文件内容读入变量并将文本直接包含在
ed
/
sed
命令中要好得多


如果要在行后插入变量的内容,可以使用

printf "%s\n" "/TWO/a" "$ext" . w | ed -s base
(只要变量没有一行只有一个句点)

或者使用GNU sed

sed -i "/TWO/a ${ext//$'\n'/\\\n}" base

toa在地址行后添加文本。

虽然Shawn给出的答案显示了可能的解决方案,但它无法解释您的尝试失败的原因

请注意,您的变量
ext
包含换行符。因此,sed在这里看到一个物理换行符。在命令行上键入时(在两行中)会收到相同的错误消息:


虽然Shawn给出的答案显示了一个可能的解决方案,但它并不能解释为什么您的尝试不起作用

请注意,您的变量
ext
包含换行符。因此,sed在这里看到一个物理换行符。在命令行上键入时(在两行中)会收到相同的错误消息:

这可能适用于您(GNU-sed):

这将把文件
extFile
放在字符串
TWO
第一次出现之后。可以使用
-i
选项修改文件

另一种解决方案:

sed -e '/TWO/!b;r extFile' -e ':a;n;ba' baseFile
注意:使用
-e
选项在
r filename
命令后拆分命令。
r
后面必须跟一个换行符,
-e
在一行上模拟此操作

如果要在每次出现字符串
TWO
之后插入文件,则只需使用(正如Shawn已经解释的):

这可能适用于您(GNU-sed):

这将把文件
extFile
放在字符串
TWO
第一次出现之后。可以使用
-i
选项修改文件

另一种解决方案:

sed -e '/TWO/!b;r extFile' -e ':a;n;ba' baseFile
注意:使用
-e
选项在
r filename
命令后拆分命令。
r
后面必须跟一个换行符,
-e
在一行上模拟此操作

如果要在每次出现字符串
TWO
之后插入文件,则只需使用(正如Shawn已经解释的):

sed '/TWO/r extFile' baseFile