在WSL中用正则提取JSON数据:测试与脚本实现方法
WSL下用正则处理JSON的实操方案
一、WSL中测试正则的常用方法
在WSL里可以用以下命令行工具快速验证正则匹配效果:
- grep(直观易用):用
-o只输出匹配部分,-E启用扩展正则,比如测试匹配url字段:grep -oE '"url":"[^"]+"' abc.json - sed:结合替换命令
s测试提取结果,比如:sed -E 's/.*"url":"([^"]+)".*/\1/' abc.json - perl:处理复杂正则更灵活,比如:
perl -nle 'print $1 if /"url":"([^"]+)"/' abc.json
二、用正则替代jq命令的实现
1. 提取顶级字段(替代jq -r '.url')
方法一:sed(兼容多行JSON)
如果JSON是多行排版,用-z参数把文件当作单行处理,避免换行截断匹配:
sed -z -E 's/.*"url":"([^"]+)".*/\1/' abc.json
单行JSON可直接去掉-z:
sed -E 's/.*"url":"([^"]+)".*/\1/' abc.json
方法二:grep(简洁高效)
用Perl正则的正向预查,直接提取字段值:
grep -oP '(?<="url":")[^"]+' abc.json
解释:(?<="url":")是正向预查,定位到"url":"之后,提取后面直到下一个双引号的内容([^"]+)。
2. 提取带特殊字符的字段(比如title)
title字段包含单引号、&符号不影响匹配,替换键名即可复用命令:
grep -oP '(?<="title":")[^"]+' abc.json
3. 提取数组字段(比如tags)
提取整个数组内容:
grep -oE '"tags":\[[^]]+\]' abc.json
只提取数组内的元素部分:
grep -oP '(?<="tags":\[)[^\]]+' abc.json
三、嵌套JSON路径的正则写法(比如.user_data.username.first_name)
假设嵌套JSON结构如下:
{"user_data": {"username": {"first_name": "John", "last_name": "Doe"}}}
要提取first_name的值,正则需适配多层嵌套和可能的空白字符:
grep -z -oP '(?<="user_data":\s*\{"username":\s*\{"first_name":\s*")[^"]+' nested.json
解释:
\s*匹配任意空白字符(空格、换行、制表符),兼容JSON的格式化排版- 用正向预查逐层定位到目标字段的键名后,提取对应值内容
四、你之前sed命令报错的原因
你执行的sed -E '(url|title|tags)"":"(("|[^"]))*' abc.json报错,是因为sed必须先指定命令(比如替换s、打印p),直接写正则表达式无意义。正确写法需补充命令,比如打印匹配这些字段的行:
sed -n -E '/"(url|title|tags)":"[^"]+"/p' abc.json
内容的提问来源于stack exchange,提问作者user18148705
相关产品推荐
相关产品推荐

