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