如何在 ash shell 中过滤掉 JSON 响应的特定部分

如何在 ash shell 中过滤掉 JSON 响应的特定部分

我使用 wget 和 -qO 来访问 OpenELEC 的特定更新程序 URL,该 URL 提供以下 JSON 响应,类似于下面的响应。

{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}

我只需要 tar 的完整文件名,不需要其他任何东西。

过滤掉所有其他不需要的信息的最佳方法是什么?

答案1

杰克会做:

$ jq ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
"OpenELEC-RPi2.arm-5.0.8.tar"

或与-r

jq -r ".data.update" <<< '{"data":{"update":"OpenELEC-RPi2.arm-5.0.8.tar","folder":"releases","host":"","MD5":""}}'
OpenELEC-RPi2.arm-5.0.8.tar

获取不带引号的(原始)字符串。

答案2

正如 FloHimself 所说,您确实应该使用真正的 JSON 解析器。有许多边缘情况无法通过简单的文本处理器轻松覆盖。

带着这个警告:

sed 's/.*"update":"\([^"]\+\)".*/\1/'

答案3

假设您将 JSON 存储在名为 的文件中jsonfile,则:

awk -F "update" '{print $2}' jsonfile | awk -F ":" '{print $2}' | awk -F "," '{ gsub(/"/,"" ); print $1}'

将给出结果OpenELEC-RPi2.arm-5.0.8.tar

请记住,它不是 JSON 解析器,因此如果您始终具有与示例相同的结构,那么这将起作用。

答案4

使用sed,通过管道将输出传送wget

sed -n 's/^.*{"update":"\([^"]*\)".*$/\1/p'

这会匹配{"update":返回字符串的部分,然后提取匹配部分后面的双引号中的内容。

相关内容