用另一个文本文件的内容替换两个单词之间的字符串
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
我对 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