Bash,如果在file_A中找到匹配的字符串,则在file_A中的匹配字符串之后复制file_B

时间:2013-10-18 09:03:32

标签: file sed append match

最近,我需要做这个工作:

第1步

例如,在file_A中查找匹配的字符串,要匹配的字符串是“ILikeeStackoverflow”。

  

file_A

     

...

     

ILikeStackoverflow

     

“ILikeStackoverflow”之后的行

     

.......

第2步

如果此字符串“ILikeeStackoverflow”已存在,则将另一个file_B(少于10行)复制到此file_A中,紧跟在该字符串之后。

因此,在执行此复制后,file_A应该看起来像这样:

  

file_A

     

...

     

ILikeStackoverflow

     

Line_1_of_file_B

     

Line_2_of_file_B

     

...

     

Line_n_of_file_B

     

“ILikeStackoverflow”之后的行

     

.......

我的代码是这样但无法正常工作(当前目录中的file_A和file_B)。

      match_string="ILikeStackoverflow" 
      sed " /^$match_string/a"$file_B" " file_A 

非常感谢您的建议!

编辑:

现在,我知道为什么我被卡住了,但无法弄清楚如何修复代码。如果您有任何想法,请继续发表评论,非常感谢!

问题是,只有当字符串占用一个单独的行时,sat的代码才有效。如果匹配的字符串只是长字符串的一部分,那么他的代码就无法工作。例如,如果fileA是这样的,那么代码就无法工作。

  

file_A

     

...

     

/测试/开始/ ILikeStackoverflow /测试/结束

     

“ILikeStackoverflow”之后的行

     

.......

实际上,在我的“index.html”中,要匹配的字符串是:“5000s-IntW300”,而包含我匹配字符串的行是:

  

/蓝色CCD的数据/ DAMIC_SNOLAB_RUN1 / 5000S-IntW300-OS

有任何修复建议吗?

再次感谢!

编辑2:

实际上,我希望将fileB复制到比匹配的字符串行多一行的位置。例如,真正的位置是:

  

file_A

     

...

     

/测试/开始/ ILikeStackoverflow /测试/结束

     

该行有重要信息,不应在此处复制fileB。

     

这是应该复制fileB的确切行。

     

.......

2 个答案:

答案 0 :(得分:1)

您可以使用此sed

sed -i.bak '/matchString/r fileB' fileA

<强>测试

档案A

sample
text
Stackoverflow
some
text

文件B

Line 1
Line 2
....
Line 10

<强>输出:

sat:~# sed -i.bak '/^Stackoverflow/r FileB' FileA
sample
text
Stackoverflow
Line 1
Line 2
....
Line 10
some
text

答案 1 :(得分:0)

关键是在匹配后读取一行,并使用N命令完成。然后使用r插入另一个文件的全部内容。最初我试过了:

sed '/Stackoverflow/ { N; r fileB };' fileA

但是给了我以下错误:

sed: -e expression #1, char 0: unmatched `{'

所以我使用了带有sed命令的文件,并使用-f开关调用它。

script.sed的内容:

/Stackoverflow/ {
        N
        r fileB
}

然后运行它:

sed -f script.sed fileA

根据sat的示例数据,它产生:

sample
text
Stackoverflow
some
Line 1
Line 2
....
Line 10
text