0

我的目标是使用 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"}]}

我想解析成两个名为textand的字符串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. 我很接近,但我无法弄清楚最后一部分。

4

2 回答 2

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
于 2016-01-19T01:00:41.023 回答
0

处理 JSON 的正确方法是使用解析器。有很多选择,例如:

  • jq,“用于 JSON 的 grep、sed 和 awk”
  • 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"

正则表达式位的"[^"]*"意思是“一个引号,然后是零个或多个非引号,然后是另一个引号”——一种非贪婪地匹配两个引号之间所有内容的方法。

为了进一步处理这个问题,我们可以用 去掉重复的行uniq,然后使用 sed 删除引号和下划线,最后用等号和制表符替换冒号:

$ grep -o -e '"_text":"[^"]*"' -e '"intent":"[^"]*"'<<< "$data" |
uniq | sed -r 's/"_?(.*)":(.*)/\1=\t\2/'
text=   "testing"
intent= "weather"
于 2016-01-19T04:02:33.413 回答