【问题标题】:Extract json value with sed使用 sed 提取 json 值
【发布时间】:2019-08-31 15:20:25
【问题描述】:

我有一个 json 结果,我想提取一个不带双引号的字符串

{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}

使用这个正则表达式,我可以正确提取 value3 (019-10-24T15:26:00.000Z)

sed -e 's/^.*"endTime":"\([^"]*\)".*$/\1/'

如何提取“value2”结果,一个不带双引号的字符串?

我需要使用 sed,所以无法安装 jq。那是我的问题

【问题讨论】:

  • 如果您已经拥有结构化信息,为什么不使用JSON 解析器呢?您使用sed 的方法很容易出错,真的(考虑换行符、转义引号等)。
  • jq '.value2' <<< "$jsonstring"
  • 不是重复的。

标签: json regex sed


【解决方案1】:

使用 GNU sed for -E 启用 ERE:

$ sed -E 's/.*"value3":"?([^,"]*)"?.*/\1/' file
2019-10-24T15:26:00.000Z

$ sed -E 's/.*"value2":"?([^,"]*)"?.*/\1/' file
2.5

使用任何 POSIX sed:

$ sed 's/.*"value3":"\{0,1\}\([^,"]*\)"\{0,1\}.*/\1/' file
2019-10-24T15:26:00.000Z

$ sed 's/.*"value2":"\{0,1\}\([^,"]*\)"\{0,1\}.*/\1/' file
2.5

以上假设您在带引号的字符串中永远没有逗号。

【讨论】:

  • 您的 POSIX sed 示例缺少右括号,例如sed 's/.*"value2":"\{0,1\}\([^,"]*\)"\{0,1\}.*/\1/' file。使用 sed 的好答案。
  • @broc.seib - 他们就是这样!现已修复,感谢您的提醒。
【解决方案2】:

只需运行 jq 一个 命令行 JSON 进程r

$ json_data='{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}'
$ jq '.value2' <(echo "$json_data")
2.5

使用密钥.value2 访问您感兴趣的值。

此链接总结了为什么您应该使用正则表达式来解析 json (同样适用于 XML/HTML 和其他数据结构 理论可以无限嵌套)

Regex for parsing single key: values out of JSON in Javascript

如果您没有可用的jq

您可以使用以下 GNU grep 命令:

$ echo '{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}' | grep -zoP '"value2":\s*\K[^\s,]*(?=\s*,)'
2.5

使用此处详述的正则表达式:

"value2":\s*\K[^\s,]*(?=\s*,)

演示: https://regex101.com/r/82J6Cb/1/

如果 json 没有线性化,这甚至可以工作!!!!

python 也很直接,你应该在你的机器上默认安装它,即使它不是 python3 它应该可以工作

$ cat data.json 
{"value1":5.0,"value2":2.5,"value3":"2019-10-24T15:26:00.000Z","modifier":[]}
$ cat extract_value2.py 
import json

with open('data.json') as f:
    data = json.load(f)
    print(data["value2"])
$ python extract_value2.py 
2.5

【讨论】:

  • 不是很有用。 jq 进来的是什么包?这个名字在什么系统上?它当然不会出现在 Ubuntu 或 Debian 上的任何默认软件包中。也许链接到下载页面。
  • 我需要使用 sed,所以无法安装 jq。那是我的问题。
  • @Guif如果您可能想在您的问题中说明这一点,以阻止大量反对票和接近投票的到来。还要解释为什么它必须是 sed 而不是 awk(所有 UNIX 安装的标准工具)。
  • @GuifIf:我在grep 解决方案之上添加了一个python 解决方案。所以你现在应该有足够的工具来提取它。干杯
  • 对于 regex 语句,我建议您在最后的 , 周围添加一个字符类,并且还包括 } 字符(即 [,}])。这样,您仍然可以捕获列表中的最后一个对象。例如:"modifier":\s*\K[^\s,]*(?=\s*[,}])
【解决方案3】:

你可以试试这个:

creds=$(eval aws secretsmanager get-secret-value --region us-east-1 --secret-id  dpi/dev/hivemetastore --query SecretString --output text )
passwd=$(/bin/echo "${creds}" | /bin/sed -n 's/.*"password":"\(.*\)",/\1/p' | awk -F"\"" '{print $1}')

当然可以删除 AWK 部分...

【讨论】:

    【解决方案4】:

    如果您的数据在 'd' 文件中,请尝试 gnu sed

    sed -E 's/[{,]"\w+":([^,"]+)/\1\n/g ;s/(.*\n).*".*\n/\1/' d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2013-09-09
      相关资源
      最近更新 更多