(Mac 终端) sed 解析 JSON ......我做错了什么?

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 解析工具 - 这里提到了几个:

/sf/ask/270107001/

它们中的任何一个都可用于从 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":


Bir*_*rei 6

这是您要查找的表达式:

sed -e 's/^.*"name":"\([^"]*\)".*$/\1/' infile
Run Code Online (Sandbox Code Playgroud)

结果是:

CastingBy-v12 mixed.mov
Run Code Online (Sandbox Code Playgroud)

在你的有几个错误:

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