如何使用curl和sed从简短的json查询中提取单个元素

时间:2011-09-19 16:08:13

标签: regex bash curl sed

我正在编写一个简短的bash脚本来从curl响应中获取JSON元素。

curl -H "api_key:[API_PASSWORD]" http://api.wordnik.com/v4/word.json/button/pronunciations?sourceDictionary=macmillan&typeFormat=IPA&useCanonical=false 

返回:

[{"id":0,"seq":0,"raw":"ˈbʌt(ə)n","rawType":"IPA"},{"id":0,"seq":0,"raw":"ˈbʌt(ə)n","rawType":"IPA"}]

我正试图提取“bʌt(ə)n”元素。

虽然我不熟悉正则表达式,但我认为我应该使用这个字符串替换:

/.*"(.*)",/

我正在尝试运行以下命令,但它似乎不起作用:

curl -H "api_key:[API_KEY]" http://api.wordnik.com/v4/word.json/button/pronunciations?sourceDictionary=macmillan&typeFormat=IPA&useCanonical=false | sed /.*"(.*)",\1/

我确信有一些事情我做错了,经过几个小时的搜索和阅读正则表达式和bash后,我没有选择。

我不需要使用sed,我只是在bash命令行中寻找一种快速方法,以便我可以在mac上的TextExpander脚本中实现它。

2 个答案:

答案 0 :(得分:7)

使用STRING : REGEXP从json字符串中提取值:

string=$(curl -H "api_key:[API_PASSWORD]" http://api.wordnik.com/v4/word.json/button/pronunciations?sourceDictionary=macmillan&typeFormat=IPA&useCanonical=false)
raw=$(expr "$string" : '.*"raw":"\([^"]*\)"')

echo $raw

请参阅man expr

   STRING : REGEXP
          anchored pattern match of REGEXP in STRING

   Pattern matches return the string matched between \(  and  \)  or null

答案 1 :(得分:1)

正则表达式可能不适合使用。 http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html

在Ubuntu 9.10上:

$ sudo apt-get install jsonlib-perl
$ curl -quiet 'http://api.wordnik.com/v4/word.json/button/pronunciations?sourceDictionary=macmillan&typeFormat=IPA&useCanonical=false' | perl -e 'use JSON; print JSON->new->allow_nonref->decode(<>)->{raw}'