由此JSON-HTML 网页我只想过滤掉具有以下模式的行:
"realname": "SOME_VALUE_COMES_HERE",
我试过这个:
curl https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&formatversion=2 -s |
grep -oP '"realname": "[A-Za-z0-9]*",' |
sort -u > special_page_names.txt
文件已创建,但它是空的。我在命令中做错了什么grep -oP
?
更新
我不使用jq
,我可以安装它,但我更喜欢“全本机”方法。
答案1
该网站提供了format=json
选项,因此您可以使用jq
:
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&formatversion=2&format=json' \
| jq -r '.query | .specialpagealiases[].realname'
答案2
首先,您需要将 url 放在引号中,这样 shell 就不会将“&”解释为将进程置于后台的命令。
接下来,curl 命令不会返回 JSON。它返回 HTML,该 HTML 表示 JSON 打印后的样子。但它在顶部表示您可以使用它&format=json
来获取实际的 JSON。
接下来,当您使用它获取 JSON 时,&format=json
它的打印效果不太好,因此您需要去掉“:”后面的空格。
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json' -s | grep -oP '"realname":"[A-Za-z0-9]*",' | sort -u > special_page_names.txt
如果要删除"realname":
结果周围的 和 引号以及末尾的逗号:
curl 'https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json' -s | grep -oP '"realname":"[A-Za-z0-9]*",' | sed -E 's/"realname":"([A-Za-z0-9]*)",/\1/' | sort -u > special_page_names.txt
这只能用作一种快速而肮脏的方法。如果您想要强大的东西,请使用真正的 JSON 解析器,或者至少使用jq
.
答案3
Python 是这里最简单的解决方案。
脚本
import sys
import requests
url = sys.argv[1]
response = requests.get(url)
if response:
if not response.ok:
print('Bad response: {0!r}'.format(response))
sys.exit(1)
else:
data = response.json()
query = data.get("query", None)
if query:
special_page_aliases = query.get("specialpagealiases", None)
if special_page_aliases:
for spa in special_page_aliases:
real_name = spa.get("realname", None)
if real_name:
print(spa.get("realname"))
sys.exit(0)
print('Bad request')
sys.exit(1)
用法
python script.py "https://www.mediawiki.org/w/api.php?action=query&meta=siteinfo&siprop=specialpagealiases&format=json"
该脚本将简单地将键“query.specialpagealiases”下的所有“realname”值转储到控制台。
编辑:我知道 OP 正在寻找本地解决方案;我只是想预先指出 python是现在是本地人。