【问题标题】:Shell Script - get values from JSONShell 脚本 - 从 JSON 获取值
【发布时间】:2020-06-16 03:05:09
【问题描述】:

我正在做一个关于通过 shell 脚本解析 JSON 的任务。执行 JSON 时有什么方法可以从 JSON 中获取值?例如,我想输出 id、body 和 age 的值。我正在尝试使用 cut、sed、grep,但不是 jq。我应该使用for循环吗? 目前,我只能将 json 重定向到 txt 文件。

{
"postId": 1,
"id": 1,
"name": "id labore ex et quam laborum",
"email": "Eliseo@gardner.biz",
"body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora",
"age": 28
}

【问题讨论】:

  • jq 是适合这项工作的工具。你为什么不用它?
  • 作业要求不用jq,只用sed、grep等
  • 到目前为止,您应该尽最大努力。这将指导那些可能提供帮助的人。 JSON 输入是否由问题中所示的单个对象组成,还是可能有多个对象?当您说“输出 ID、身体和年龄”时,该输出应该采用什么形式?
  • sedgrep 都是基于正则表达式的,因此不能解析像 JSON 这样可以包含嵌套语法的东西(例如,JSON 允许数组内的数组内的数组内... .)。它与HTML 属于同一类别。如果 JSON 足够简单,您可以伪造它,但如果 JSON 不是您期望的确切格式,则使用正则表达式解析 JSON 将失败。
  • @Gordon,如果我理解正确,sedgrep 不能像删除括号、逗号和键一样。然后只留下那些值?

标签: json bash shell


【解决方案1】:

如果您真的必须使用 shell 方法(确实有很多陷阱)并且您的实际 json 输入与您显示的并没有太大不同, 这是我的看法。读取两个字段,key 和 value,如果 key 匹配,对 value 做一些事情。

while read -r key value; do
  case $key in
    ('"id":')   printf '%s\n' "id=${value%,}";;
    ('"body":') printf '%s\n' "body=${value%,}";;
  esac
done < json.txt

这将输出

id=1
body="laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多