Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File Bash,如果在文件_a中找到匹配的字符串,则将文件_B复制到文件_a中匹配的字符串之后_File_Sed_Append_Match - Fatal编程技术网

File Bash,如果在文件_a中找到匹配的字符串,则将文件_B复制到文件_a中匹配的字符串之后

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

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

第一步

在文件_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的精确行


您可以使用此
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
开关调用它。如果你有问题,告诉我们,我会把它作为一个答案。