【问题标题】:Reading strings from JSON using ksh使用 ksh 从 JSON 读取字符串
【发布时间】:2017-02-15 14:45:43
【问题描述】:
{

  "assignedTo": [

    "Daniel Raisor",
    "Dalton Leslie",
    "Logan Petro"  
]

}

我想提取 Daniel Raisor Dalton Leslie 和 Logan Petro 并将它们分配给一个单独的变量,例如 assignTo=Daniel Raisor,Dalton Leslie,Logan Petro 我的 unix 也不支持 jq ,我需要使用 grep 或 sed 命令来做到这一点

【问题讨论】:

  • 如果您需要使用JSON,您需要获得一个可以使用JSON的工具; grep 等。不要。此外,未预装jq 并不一定意味着不支持jq;它非常便携且易于安装。
  • grepsed 无法可靠地解析 JSON。你可以想出一个可怕的 hack 来使用它们,但它会是一个 hack,而且它会很脆弱——比如,编码或内容的变化没有任何东西用语法做就可以破解了。
  • 相比之下——你有 Python 解释器吗?从 shell 调用 Python 非常容易,并在其中使用内置的 JSON 解析模块。
  • 请务必检查您的解决方案是否适用于不同的空格——即。 {"assignedTo":["Daniel Raisor","Dalton Leslie","Logan Petro"]} 都在一条线上。或者 extra 换行符放在随机位置。或带有引号的名称,例如 "Logan \"The Man\" Wilson"
  • Falsehoods Programmers Believe About Names。在尝试确定哪些字符不可能是名称的一部分时,请考虑其中的一些,因此可以用来将两个名称彼此分开。

标签: shell ksh


【解决方案1】:

使用适当的 JSON 解析器来解析 JSON。即使您没有jq,Python 解释器中也包含一个非常好的工具,以下示例脚本使用它:

#!/bin/ksh
# note: this was tested with ksh93u+ 2012-08-01
# to use with Python 3 rather than Python 2, replace "pipes" with "shlex"

json='{"assignedTo": ["Daniel \"The Man\" Raisor","Dalton Leslie","Logan Petro"]}'

getEntries() {
  python -c '
import json, sys, pipes

content = json.load(sys.stdin)
for name, values in content.iteritems():
  print("%s=%s" % (pipes.quote(name), pipes.quote(",".join(values))))
'
}

eval "$(getEntries <<<"$json")"
echo "$assignedTo"

...正确发出以下输出:

Daniel "The Man" Raisor,Dalton Leslie,Logan Petro

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多