File Bash,如果在文件_a中找到匹配的字符串,则将文件_B复制到文件_a中匹配的字符串之后
最近,我需要做这项工作: 第一步 在文件_a中查找匹配的字符串,例如,要匹配的字符串是“ILikeeStackoverflow” 档案室 Ilikestack溢出 “ILikeStackoverflow”后面的行 步骤2 如果存在此字符串“ILikeeStackoverflow”,则将另一个文件_B(少于10行)复制到此文件_A中,就在该字符串之后 因此,完成此复制后,文件_A应如下所示: 档案室 Ilikestack溢出 _文件_B的第_1_行 _文件_B的第_2_行 文件的第行 “ILikeStackoverflow”后面的行 我的代码是这样的,但不能正常工作(当前目录中的文件A和文件B) 谢谢你的建议 编辑: 现在,我知道为什么我被卡住了,但不知道如何修复代码。如果你有想法,请继续评论,谢谢 问题是,只有当字符串占用单独的一行时,sat的代码才能工作。如果匹配的字符串只是长字符串的一部分,那么他的代码就不能工作。例如,如果fileA是这样的,那么代码就不能工作 档案室 /测试/开始/溢出/测试/结束 “ILikeStackoverflow”后面的行 实际上,在我的“index.html”中,要匹配的字符串是:“5000s-IntW300”,而包含匹配字符串的行是: /蓝色ccd数据/DAMIC\U SNOLAB\U RUN1/5000s-IntW300-OS 有什么解决办法吗 再次非常感谢 编辑2: 实际上,我想在匹配的字符串行之后多复制一行文件B。例如,实际情况是: 档案室 /测试/开始/溢出/测试/结束 该行包含重要信息,文件B不应复制到此处 这是应该复制的文件B的精确行File Bash,如果在文件_a中找到匹配的字符串,则将文件_B复制到文件_a中匹配的字符串之后,file,sed,append,match,File,Sed,Append,Match,最近,我需要做这项工作: 第一步 在文件_a中查找匹配的字符串,例如,要匹配的字符串是“ILikeeStackoverflow” 档案室 Ilikestack溢出 “ILikeStackoverflow”后面的行 步骤2 如果存在此字符串“ILikeeStackoverflow”,则将另一个文件_B(少于10行)复制到此文件_A中,就在该字符串之后 因此,完成此复制后,文件_A应如下所示: 档案室 Ilikestack溢出 _文件_B的第_1_行 _文件_B的第_2_行 文件的第行 “I
您可以使用此
sed
sed -i.bak '/matchString/r fileB' fileA
测试:
sat:~# sed -i.bak '/^Stackoverflow/r FileB' FileA
sample
text
Stackoverflow
Line 1
Line 2
....
Line 10
some
text
文件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
关键是在匹配后读取一行,这是通过
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
根据的示例数据,得出:
sample
text
Stackoverflow
some
Line 1
Line 2
....
Line 10
text
感谢您的回复,但它对我来说不起作用-至少在我的代码脚本中:
sed-i.bak/^$table\u key\u words\u monitoring\u mainpage/r$modified\u one\u entry\u table”index.html
,其中$table\u key\u words\u monitoring\u mainpage
是关键词,$modified\u one\u entry\u table
是文件,index.html
是文件。有什么建议吗?@user2740039,看起来你在混合A和B:sed-i.bak/^$table\u key\u words\u monitoring\u mainpage/r index.html“$modified\u one\u entry\u table
@glennjackman,在我的例子中,我想将modified_one_entry_table
的文件复制到我的index.html
中“$table\u key\u words\u monitoring\u mainpage”的关键字行之后。不管怎样,我还是按照你的建议修改了我的代码,但也没用。此外,它还会生成无用的文件,如modified\u one\u entry\u table.bak
@user2740039,您是否尝试过我在回答中指定的示例文件?您能告诉我您的OS和sed版本吗。@sat,您的示例文件可以通过命令行和脚本上的代码测试。然而,它不能适应我的剧本,这显然是我最关心的。我的操作系统是:openSUSE 12.2,sed是GNU sed版本4.2.1。您如何运行sat的命令?注意,他的<代码> ^ 在开始行时有一个零宽度断言,这不是在代码行中的“代码>5000”-iTW300 < /代码>的情况。“Birei,你明白了!我也是!所以,当我删除这个^
时,它就工作了!然而,还有一个小而重要的问题:我将再次编辑我的帖子!因此,您希望在匹配后两行插入另一个文件的内容,而不是在下一行中。总是这样还是取决于其他事情?@Birei:非常感谢您的回复!它总是这样。因为在我的代码中,匹配的行和它的下一行不应该分开。答案的基数是有用的。在使用r
命令追加fileB
的内容之前,必须添加读取下一行的N
。它似乎无法将组中的文件检测为一行命令,因此您可能必须使用文件并使用-f
开关调用它。如果你有问题,告诉我们,我会把它作为一个答案。