如何用jq调用外部pup命令提取JSON中HTML的script标签并生成新JSON
问题描述
给定如下输入JSON:
{ "url": "https://www.example.com", "html": "<html>...</html>" }
需要结合jq和外部命令pup,从html字段中提取所有type="text/javascript"的<script>标签内容,最终生成如下结构的新JSON:
{ "url": "https://www.example.com", "scripts": [ "<script>...", "<script>..." ] }
直接在jq表达式内部调用pup会失败,因为pup不是jq内置功能,比如以下命令无法生效:
jq -c '{url: .url, scripts: [.html | pup "script[type=text/javascript] text{}"]}'
解决方案
由于jq无法直接在表达式内部调用外部命令处理字段内容,可通过分步提取+组合的方式实现需求,以下是两种可行方案:
方案1:使用临时变量分步处理
先单独提取url,再处理html得到脚本数组,最后用jq将两者组合成目标JSON:
# 提取url到变量 URL=$(jq -r '.url' example.json) # 处理html,将pup输出的每行脚本转为JSON字符串数组 SCRIPTS=$(jq -r '.html' example.json | pup 'script[type="text/javascript"] text{}' | jq -R . | jq -s .) # 构造最终JSON jq -n --arg url "$URL" --argjson scripts "$SCRIPTS" '{url: $url, scripts: $scripts}'
方案2:单管道无临时变量处理
通过shell子shell读取url并同步处理html,一步完成组合:
jq -r '.url + "\n" + .html' example.json | { read URL # 将pup输出的每行脚本转为JSON数组 SCRIPTS=$(pup 'script[type="text/javascript"] text{}' | jq -R . | jq -s .) jq -n --arg url "$URL" --argjson scripts "$SCRIPTS" '{url: $url, scripts: $scripts}' }
关键步骤说明
pup 'script[type="text/javascript"] text{}':提取所有目标脚本内容,每行输出一个脚本jq -R .:将每行文本转为合法的JSON字符串jq -s .:将所有JSON字符串合并为一个数组jq -n --arg ... --argjson ...:通过参数传入url和scripts数组,构造目标JSON结构
内容的提问来源于stack exchange,提问作者alturkovic
相关产品推荐
相关产品推荐

