Dan*_*Dan 4 sed regular-expression json macos
在 Mac 终端中,我试图从这个 JSON 响应中解析“名称”:
{"created_at":"2012-08-27T20:04:27Z","deleted_at":null,"id":21462840,"item_type":"video","name":"CastingBy-v12 mixed.mov", "private":true,"redirect_url":null,"remote_url":"http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov","source":"Cloud/1.5.4 CFNetwork/520.4.3 Darwin/11.4.0 (x86_64) (MacPro5%2C1)","updated_at":"2012-08-27T20:13:38Z","view_counter":2,"href":"http:// /my.cl.ly/items/2840","icon":"http://my.cld.me/images/item-types/video.png","subscribed":true,"url":"http ://files.housenyc.com/1I3E2F3C","content_url":"http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed。mov","download_url":"http://files.eeehousenyc.com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov","gauge_id":null}
我正在使用
sed 's/{.*?"name":"\(.+?\)".*/\1/'
但它返回整个字符串。
我希望它返回
CastingBy-v12 mixed.mov
cas*_*cas 10
仅使用 sed 解析 json 与解析 HTML 一样有问题 - 简而言之:由于元素可以嵌入其他元素并且正则表达式不支持递归,因此仅使用正则表达式基本上不可能正确解析。
这里有一个解析和验证 json 的 PCRE 解决方案:https : //stackoverflow.com/questions/2583472/regex-to-validate-json - 我没有使用或测试过它,所以我必须相信作者的话它有效……但是PCRE 做了很多不在 sed 支持的基本或扩展正则表达式中的事情。
在任何情况下,IMO 最好使用 perl 或 python 或 awk 以及这些语言的 json 解析库之一,或专门的 json 解析工具 - 这里提到了几个:
它们中的任何一个都可用于从 JSON 输入中提取数据以在 shell 脚本中使用。或者您可以使用该语言编写整个程序。
例如,将 json 数据通过管道传输到 python -mjson.tool 会导致:
$ echo "JSONDATAHERE" | python -m json.tool
{
"content_url": "http://files.eeehousenyc.com/1I3Q0Z1E2F3C/CastingBy-v12%20mixed.mov",
"created_at": "2012-08-27T20:04:27Z",
“deleted_at”:空,
"download_url": "http://files.eeehousenyc.com/1I3Q0F3C/download/CastingBy-v12%20mixed.mov",
“gauge_id”:空,
"href": "http://my.cl.ly/items/2840",
"icon": "http://my.cld.me/images/item-types/video.png",
“身份证”:21462840,
"item_type": "视频",
"name": "CastingBy-v12 mix.mov",
“私人”:真的,
“redirect_url”:空,
"remote_url": "http://f.cl.ly/items/3D0P02b3e3p2I/CastingBy-v12%20mixed.mov",
"source": "Cloud/1.5.4 CFNetwork/520.4.3 Darwin/11.4.0 (x86_64) (MacPro5%2C1)",
“订阅”:真的,
"updated_at": "2012-08-27T20:13:38Z",
"url": "http://files.housenyc.com/1I3E2F3C",
“查看计数器”:2
}
然后您可以像这样将其输送到 sed 中:
$ echo "JSONDATAHERE" | python -m json.tool | sed -n -e '/"name":/ s/^.*"\(.*\)".*/\1/p'
CastingBy-v12 mixed.mov
Run Code Online (Sandbox Code Playgroud)
依托正则表达式的贪婪的本性,倒数第二个之间的sed脚本提取物的一切",最后"性格上的任何行包含"name":。
这是您要查找的表达式:
sed -e 's/^.*"name":"\([^"]*\)".*$/\1/' infile
Run Code Online (Sandbox Code Playgroud)
结果是:
CastingBy-v12 mixed.mov
Run Code Online (Sandbox Code Playgroud)
在你的有几个错误:
sed仅在贪婪表达式中可以使用:.*?和.+?不正确。+必须进行转义。[^"]*以避免直到字符串的最后一个双引号的正则表达式匹配。| 归档时间: |
|
| 查看次数: |
20589 次 |
| 最近记录: |