用另一个文本文件的内容替换两个单词之间的字符串

时间:2015-08-08 15:35:28

标签: regex sed textedit

我对sed和regex有点新鲜。

我正在尝试编辑一个文本文件,我希望将第一个文件中两个关键字之间的内容替换为另一个文本文件的全部内容

它应该是这样的 -

keyword1 inbetweenstuff keyword2

到这个

keyword1 textfromfile2 keyword2

我正在尝试这个命令,但没有运气

sed -i 's/(keyword1).*(keyword2)/\1 contentsoffile2 \2/g' file1.txt

3 个答案:

答案 0 :(得分:3)

您尝试使用错误的工具。 sed用于单独行(s/old/new/)上的简单替换,即全部。对于任何更有趣的事情,你应该使用awk。

使用GNU awk进行多字符RS,gensub()和第3次arg进行匹配():

$ cat file1
keyword1 IN BETWEEN
STUFF ON
ONE OR MORE
LINES keyword2

$ cat file2
NOW IS
THE WINTER OF
OUR DISCONTENT

$ cat tst.awk
BEGIN { RS="^$"; ORS="" }
NR==FNR { new = gensub(/\n$/,"",""); next }
match($0,/(.*keyword1 ).*( keyword2.*)/,a) { print a[1] new a[2] }

$ awk -f tst.awk file2 file1
keyword1 NOW IS
THE WINTER OF
OUR DISCONTENT keyword2

请注意,上面将file2的内容视为文字字符串,因此" file2"的内容可以是任何东西。如果" file2"请尝试任何sed解决方案。例如,包含&(或\1/或...)。它也不关心file2中有多少行,或者file1中的关键字之间有多少行。

答案 1 :(得分:1)

这里有一个随时可用的解决方案:

$ sed -i "s/\(keyword1\).*\(keyword2\)/\1 `cat file2` \2/g" file1

它从file2读取并替换file1内的两个关键字之间的文字(仅当file2中的内容不是多行时才有效。)

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -e '/keyword1\s*/{:a;/\s*keyword2/!{N;ba};s/\n//g;s/keyword1\s*/&\n/;s/\s*keyword2/\n&/;P;e cat inserted_file' -e 's/.*\n//}' file

这将查找keyword1并将该行以及后续行保留在模式空间中的keyword2之前。然后删除所有换行符,并在keyword1之后和keyword2之前插入换行符。然后打印keyword1之前的部分行,然后是inserted_file,最后是keyword2到其行尾。

这将使用换行符围绕inserted_file。如果不需要这些,则使用以下命令处理该文件:

sed -r 'N;s/(keyword1\s*)\n/\1/;s/\n(\s*keyword2)/\1/;P;D' new_file
相关问题