【问题标题】:How to extract the value of "name" from this puppet metadata.json without jq in shell?如何在 shell 中没有 jq 的情况下从此 puppet metadata.json 中提取“name”的值?
【发布时间】:2015-10-14 21:12:00
【问题描述】:

由于某些极端原因,我无法使用 jq 或其他 cli 工具。我需要从匹配这个 puppet metadata.json 的任何 json 中提取“name”的值。格式。

json 可能没有正确格式化和缩进,但会有效。含义、空格和换行符、回车符可能会插入到符合条件的位置。

请注意,依赖项数组中可能有“名称”元素。

那么,如何只使用标准的 unix 命令和/或 shell 脚本来提取值而不安装任何应用程序,如 jq 或其他工具?

谢谢!!

{
  "name": "examplecorp-mymodule",
  "version": "0.0.1",
  "author": "Pat",
  "license": "Apache-2.0",
  "summary": "A module for a thing",
  "source": "https://github.com/examplecorp/examplecorp-mymodule",
  "project_page": "https://forge.puppetlabs.com/examplecorp/mymodule",
  "issues_url": "https://github.com/examplecorp/examplecorp-mymodule/issues",
  "tags": ["things", "stuff"],
  "operatingsystem_support": [
    {
    "operatingsystem":"RedHat",
    "operatingsystemrelease":[ "5.0", "6.0" ]
    },
    {
    "operatingsystem": "Ubuntu",
    "operatingsystemrelease": [ "12.04", "10.04" ]
    }
   ],
  "dependencies": [
    { "name": "puppetlabs/stdlib", "version_requirement": ">=3.2.0 <5.0.0" },
    { "name": "puppetlabs/firewall", "version_requirement": ">= 0.0.4" }
  ]
}

【问题讨论】:

  • “或其他工具”?你甚至没有 Python 解释器? (您可以使用 python -m json 使用单行解析 JSON)。需要明确的是:jq 是普遍建议的,因为 shell 本身不能可靠地做到这一点。可以想出一些技巧,但它们是hacks——意思是没有结构意识,这意味着他们无法正确应对所有可能的极端情况。

标签: json regex shell unix puppet


【解决方案1】:

它丑陋、可怕、可怕,不知道结构,如果您的输入文件中有额外的内容与您要查找的内容相似,它会给您错误的结果 -- 但是...

#!/bin/bash
#      ^- NOT /bin/sh; shell-native regexes are a bash extension

contents=$(<in.json)
if [[ $contents =~ '"name":'[[:space:]]*'"'([^\"]*)'"' ]]; then
  echo "Found name: ${BASH_REMATCH[1]}"
fi

现在,让我们谈谈这个答案被破坏的一些方式(使用 jq 会更好):

  • 它会找到第一个名称,即使它不在外层嵌套层。也就是说,如果"dependencies": [ { "name": "puppetlabs/stdlib", "version_requirement": "&gt;=3.2.0 &lt;5.0.0" } ]"name": "examplecorp-mymodule"之前,猜猜哪个结果是被发现? (对此的简单解决方法是对空格/格式做出假设,因此不能证明同一数据的所有可能的 JSON 表达式)。
  • 它不会对您名称中需要取消转义的内容进行转义(考虑包含编码为&amp;foo; 的符号的名称)。
  • 它不支持多字节字符,因此不能保证发出与代码点边界对齐的输出。
  • 如果您的名称带有转义的\" 子序列...那么,猜猜那里会发生什么?

等等。它不像尝试使用正则表达式解析 XML 那样糟糕(JSON 更容易!),但它仍然是一团糟。

【讨论】:

    【解决方案2】:

    这应该适合你:

    jq '.name' metadata.json
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 2014-08-31
      • 2013-08-28
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多