使用jq插入HTML模板时遇语法错误:原始输入不被接受
问题分析
你遇到的语法错误确实源于Shell层面的引号与特殊字符转义问题。HTML模板中的双引号、单引号、反斜杠等字符,会在Shell将参数传递给jq之前被解析变形,导致jq接收到的内容不符合JSON语法规范,哪怕使用--raw-input也无法解决Shell提前解析的问题。
修正方案
以下是几种可靠的解决方法,按推荐程度排序:
方法1:使用jq的--arg选项传递变量(推荐)
让jq直接读取Shell变量,完全规避Shell转义干扰,是最稳妥的方式:
# 假设你的格式化后HTML内容存储在变量html_content中 html_content="<div class='test'>Hello \"World\"</div>" # 通过--arg将变量传入jq,更新指定JSON字段 jq --arg html "$html_content" '.Body.Html.Data = $html' input.json > output.json
--arg会自动处理变量内的引号、特殊字符,无需手动转义,jq内部会正确识别并插入到JSON字段中。
方法2:通过Here-Doc传递原始HTML内容
如果HTML内容较长或包含大量特殊字符,可使用Here-Doc让jq直接读取原始内容,避免Shell解析:
# 从HTML文件读取内容传入jq jq '.Body.Html.Data = input' input.json <<EOF $(cat your_formatted_html.html) EOF # 也可直接将HTML内容写在EOF之间 jq '.Body.Html.Data = input' input.json <<EOF <div class="container"> <p>包含"双引号"、'单引号'和换行的内容</p> </div> EOF
Here-Doc会完整保留HTML的原始格式,input函数会读取标准输入的原始内容并赋值给指定字段。
方法3:手动转义HTML中的特殊字符(不推荐)
若必须直接传递字符串,需手动转义HTML中的双引号、反斜杠等特殊字符:
# 转义反斜杠为\\,双引号为\" escaped_html=$(echo "$html_content" | sed 's/\\/\\\\/g; s/"/\\"/g') # 将转义后的内容传入jq jq ".Body.Html.Data = \"$escaped_html\"" input.json > output.json
这种方式容易遗漏特殊字符(如单引号、换行符),仅适合简单HTML场景。
内容的提问来源于stack exchange,提问作者forevernewbie
相关产品推荐
相关产品推荐

