如何在 sed 替换命令中包含任何内容?

如何在 sed 替换命令中包含任何内容?

我希望能够处理存储在 bash 变量中的任何类型的内容${CONTENT},用作sed另一个内容的替换文本,无论带有 CSS 的 HTML 文件是否可以包含引号、单引号或其他特殊字符,无需创建临时文件。

CONTENT=$(cat "${HTML_FILE}")
HTML=$(cat "parent_file.html" | tr -d '\n' | sed -E "s/(<body[^>]*>).*(<\/body>)/\1\n${CONTENT}\n\2/")

但这会出错,并出现如下错误:

sed: -e expression #1, char XXX: unterminated `s' command

我所要求的事情可能实现吗?

答案1

正如评论所指出的,一般情况下解析 HTML 不应该在 bash 中完成。有一些工具,例如xq他们致力于正确地做到这一点。

话虽如此,对于您的具体示例,有一个简单的解决方案。因为在 HTML 中不需要遵循任何内容</body>,所以您可以简单地使用 sed 删除原始内容,然后分别插入您的内容以及结束标记:

CONTENT="$(cat "${HTML_FILE}")"
HEADERS="$(tr -d '\n' <"parent_file.html" | sed -E "s/(<body[^>]*>).*$/\1\n/")"
HTML="${HEADERS}${CONTENT}</body>"

(为了清楚起见,我将内容保留在上面的变量中。HTML 可能会变得非常大,因此在现实生活中,我建议动态解析而不是使用中间变量。)

相关内容