我正在编写一个简短的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脚本中实现它。
答案 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}'