如何用Bash等工具从Firefox的recovery.js获取活动标签页URL
从Firefox的recovery.js单行文件中提取指定URL
需求:Firefox的recovery.js为单行文件,包含唯一字符串
"_closedTabs",需提取该字符串之前第一个出现的URL(即从_closedTabs往前数的第一个{"url":"address"}结构中的地址)。
示例字符串:"the-beginning",[{"url":"other-address"}],[{"url":"the-address"}],"the-middle","_closedTabs","the-end"
预期输出:the-address;未找到匹配内容则输出No url found。
已尝试jq但无法高效处理50MB大文件,希望用awk、grep、sed或纯Bash实现。
方法1:awk实现
通过截取目标字符串前的内容,再匹配末尾的最后一个URL结构来提取地址:
awk -F'"_closedTabs"' '{ if (NF < 2) { print "No url found"; exit } part = $1 match(part, /{"url":"[^"]*"[^}]*}$/, arr) if (arr[0] != "") { sub(/{.*"url":"([^"]*)".*/, "\\1", arr[0]) print arr[0] } else { print "No url found" } }' recovery.js
逻辑说明
- 以
"_closedTabs"为分隔符,提取目标字符串之前的所有内容 - 匹配该内容末尾的最后一个
{"url":"..."}结构 - 提取结构中的URL地址,无匹配则输出提示
方法2:sed实现
通过逐步删除无关内容,保留最后一个URL结构并提取地址:
sed -n ' s/.*"\_closedTabs".*//; :loop s/.*{"url":"[^"]*"[^}]*}\(.*\)/\1/; t loop; s/.*{"url":"\([^"]*\)".*/\1/; T notfound; p; q; :notfound s/.*/No url found/; p ' recovery.js
逻辑说明
- 先删除
_closedTabs及之后的所有内容 - 循环删除开头的所有
{"url":"..."}结构,直到剩下最后一个 - 提取该结构中的URL地址,无匹配则跳转到提示输出
方法3:纯Bash实现
利用Bash原生字符串处理功能反向查找目标结构:
#!/bin/bash content=$(<recovery.js) # 截取"_closedTabs"之前的内容 before=${content%"_closedTabs"*} if [[ -z "$before" ]]; then echo "No url found" exit 0 fi # 循环定位最后一个{"url":"的位置 pattern='{"url":"' pos=$(expr index "$before" "$pattern") while [[ $pos -gt 0 ]]; do temp=${before:$pos} next_pos=$(expr index "$temp" "$pattern") if [[ $next_pos -eq 0 ]]; then break fi before=$temp pos=$next_pos done if [[ $pos -eq 0 ]]; then echo "No url found" exit 0 fi # 提取URL内容 url_part=${before#*"$pattern"} url=${url_part%%\"*} echo "$url"
逻辑说明
- 读取文件内容并截取
_closedTabs之前的部分 - 循环查找最后一个
{"url":"的位置 - 提取该位置到下一个双引号之间的内容作为URL
内容的提问来源于stack exchange,提问作者Timm
相关产品推荐
相关产品推荐

