sed将多行文件中的标记替换为另一个文件的内容



文件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组成的字符串。

相关内容

  • 没有找到相关文章

最新更新