如何在没有jq的情况下从此p metadata.json提取“ name”的值?

问题描述 投票:-1回答:2

出于某些极端原因,我不能使用jq或其他cli工具。我需要从与该人偶metadata.json匹配的所有json中提取“名称”的值。格式。

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" }
  ]
}
json regex shell unix puppet
2个回答
0
投票

这是丑陋的,可怕的,可怕的,不了解结构的,如果您的输入文件中有看起来与您要查找的内容相似的多余内容,则会给您不正确的结果-但是...

#!/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会更好):

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

等等它不像尝试使用正则表达式解析XML那样糟糕(JSON更容易!),但还是很混乱。


0
投票

这应该为您工作:

jq '.name' metadata.json
© www.soinside.com 2019 - 2024. All rights reserved.