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

Replace string between two words with the content of another text file

我对 sed 和正则表达式有点陌生。

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

应该是这样的 -

keyword1 inbetweenstuff keyword2

至此

keyword1 textfromfile2 keyword2

我正在尝试这个命令,但没有成功

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

好的,这是一个随时可用的解决方案:

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

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

您正在尝试使用错误的工具。 sed 用于在各行 (s/old/new/) 上进行简单替换,仅此而已。对于任何更有趣的事情,你应该使用 awk。

使用 GNU awk 用于多字符 RS、gensub() 和 match() 的第三个参数:

$ 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([=10=],/(.*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" 包含 &(或 </code> 或 <code>/ 或 ...),请尝试任何 sed 解决方案。它也不关心 file2 中有多少行或 file1 中的关键字之间有多少行。

这可能对你有用 (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 并在模式 space 中保留该行以及可能的后续行直到 keyword2。然后删除所有换行符并在 keyword1 之后和 keyword2 之前插入换行符。然后打印 keyword1 之前的部分行,然后是 inserted_file,最后从 keyword2 到行尾。

这将用换行符包围 inserted_file。如果不需要这些,则 post 处理该文件:

sed -r 'N;s/(keyword1\s*)\n//;s/\n(\s*keyword2)//;P;D' new_file