我的目标是使用shell文件解析来自wit.ai的文本,我似乎无法正确使用它,因为字符串(名为data
)可能会大不相同。我一直试图使用sed命令,但没有运气。服务器的响应看起来像这样(但请记住它的大小可能不同):
data=
{"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}]}
我想分析成两个名为text
和intent
的字符串。
所需的结果应该是两个字符串,如下所示
text= "testing"
intent= "weather"
我到目前为止的代码是:
data='{"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}$
text=$(echo $data | cut -d"," -f1 ) #removes text down to testing but leaves a quote at the end
text=$(echo "${text::-1}") # this line removes the quote
echo $data
echo $text
目前的结果是:
{"status":"ok"}{"_text":"testing
我很接近我只需要移除{"status":"ok"}{"_text":"
,因此我留下了testing
。我很接近,但我无法想出最后一部分。
答案 0 :(得分:0)
好吧它不是很优雅,但这似乎有效
data='{"status":"ok"}{"_text":"testing","msg_id":"56a26ccf-f324-455f-ba9b-db21c8c7ed50","outcomes":[{"_text":"testing","confidence":0.289,"entities":{},"intent":"weather"}$
text=$(echo $data | cut -d"," -f1 ) #removes text down to testing but leaves a quote at the end
text=$(echo "${text::-1}") # this line removes the quote
text=$(echo $text | cut -d"_" -f2 ) # removes beginning but still leaves "text":""
text=$(echo $text | cut -d":" -f2 ) # removes beginning but still leaves """ atr the beginning
text=$(echo ${text:1} )
echo $data
echo $text
答案 1 :(得分:0)
处理JSON的正确方法是使用解析器。有很多选择,例如:
jq
," grep,sed& awk for JSON" JSON.sh
,一个用Bash编写的解析器(并在www.json.org上正式推荐)json_pp
,Perl的漂亮打印机所有这些以及data
的问题在于他们抱怨说这是错误的;如果他们 工作,您可以直接查询您的数据,如上述链接工具的所有教程所示。
既然你不能,我们就会直接回到文本中。我们可以使用grep -o
提取感兴趣的数据,它只返回它匹配的内容:
$ grep -o -e '"_text":"[^"]*"' -e '"intent":"[^"]*"'<<< "$data"
"_text":"testing"
"_text":"testing"
"intent":"weather"
正则表达式位"[^"]*"
表示&#34;引用,然后是零或更多非引号,然后是另一个引号&#34; - 非贪婪地匹配两个引号之间的所有内容的方法。
为了进一步处理这个问题,我们可以使用uniq
删除重复行,然后使用sed删除引号和下划线,最后用等号和标签替换冒号:
$ grep -o -e '"_text":"[^"]*"' -e '"intent":"[^"]*"'<<< "$data" |
uniq | sed -r 's/"_?(.*)":(.*)/\1=\t\2/'
text= "testing"
intent= "weather"