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
仅在贪婪表达式中可以使用:.*?
和.+?
不正确。+
必须进行转义。[^"]*
以避免直到字符串的最后一个双引号的正则表达式匹配。