0

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

步骤1

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

文件_A

……

IlikeStackoverflow

“ILikeStackoverflow”之后的行

…………

第2步

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

所以在完成这个副本之后,file_A 应该看起来像这样:

文件_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 是这样的,那么代码就不能工作。

文件_A

……

/test/begin/ILikeStackoverflow/test/end

“ILikeStackoverflow”之后的行

…………

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

/blue-ccd-data/DAMIC_SNOLAB_RUN1/5000s-IntW300-OS

有什么建议可以解决吗?

再次非常感谢!

编辑2:

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

文件_A

……

/test/begin/ILikeStackoverflow/test/end

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

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

…………

4

2 回答 2

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
于 2013-10-18T09:16:42.543 回答
0

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

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

但给了我以下错误:

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

所以我使用了一个带有命令的文件并使用switchsed调用它。-f

内容script.sed

/Stackoverflow/ {
        N
        r fileB
}

并像这样运行它:

sed -f script.sed fileA

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

sample
text
Stackoverflow
some
Line 1
Line 2
....
Line 10
text
于 2013-10-18T15:19:33.113 回答