文件1:
<!doctype html><html lang="en"><head><meta name="REPLACE_ME"></head><body></body></html>
文件2:
<meta name="A" content="A1"><meta name="B" content="B1">
我正在尝试用File 2
的全部内容替换File 1
中的<meta name="REPLACE_ME">
。
预期结果:
<!doctype html><html lang="en"><head><meta name="A" content="A1"><meta name="B" content="B1"></head><body></body></html>
如果File 1
有多条线,我可以使用这样的东西:
TOKEN="<meta name=\"REPLACE_ME\">"
sed -e "/${TOKEN}/r file2" -e "/${TOKEN}/d" file1
我遇到的问题是,当File 1
中的不在单独的行上时,如何使用sed
执行此操作。
这是我的最后一次尝试:
TOKEN="<meta name=\"REPLACE_ME\">"
sed "s/${TOKEN}/$(sed -e 's/[&/]/\&/g' -e 's/$/\n/' file2 | tr -d 'n')/" file1
然而,它很时髦,并且使用tr
,我想避免使用它。如有任何帮助,我们将不胜感激。
正如其他人所评论的,您应该为此使用专用的html解析器,但由于您的样本数据有限,使用sed:可以实现您所需要的功能
sed -zrn 's@n@@g;s@(^.*<head>)('"$TOKEN"')(</head>.*</html>)(<meta.*$)@143@p' <(cat file1 file2)
将单个输入流重定向到sed并使用(-z)作为一行使用。首先删除所有换行符,然后使用正则表达式(-r或-E)并使用变量TOKEN将该行拆分为括号中描述的4个部分。将第1节的行替换为第4节和第3节。
我知道应该没有必要使用cat作为一个流进行引导,因为sed应该将文件视为一个流,除非使用-s,但我在分割行时遇到了问题。
这可能对你有用(GNU sed):
sed -E 's/(.*)<meta name="REPLACE_ME">(.*)/echo "1$(cat file2)2"/e' file1
在<meta name="REPLACE_ME">
上进行匹配,并使用反向引用来收集匹配两侧的数据。然后计算并回显一个由返回引用和夹在它们之间的file2组成的字符串。