我想从文本文件中的某一行提取版本并将其用作命令

我想从文本文件中的某一行提取版本并将其用作命令

例如我在文件“somefile.json”中的文本:

{
  "dependencies": {
    "name1": "text1#version1",
    "name2": "text2#version2",
    "name3": "text3#version3"
  },
  "wont-need-to-get-versions-from-here": [
    {
      "randomtext": "randomtext",
      "randomurl": "randomurl",
      "scopes": [
        "randomscope"
      ]
    }
  ]
}

我想"version2"在 的帮助下获得"name2",然后将其用作命令的扩展,例如如果命令是"command",则在获得后"version2"应该是"command#version2"。也许此命令和提取"version2"后应该写入某个 .sh 文件? (抱歉,如果这是一个愚蠢的问题)

答案1

假设字符串name2command是您正在查找的命令的两个输入,并且考虑到问题中的文档,您希望command#version2使用这些字符串从查询中获取结果。

jq命令用于查询或修改JSON文档。下面的命令从子对象中提取值,dependencies该子对象的键对应于字符串name2(或 shell 变量中作为字符串给出的任何内容key)。它将第一个#字符之前的值部分替换为command(或 shell 变量中给出的任何内容cmd)。如果需要,生成的字符串将被解码并打印到标准输出流。

key='name2'
cmd='some command'

jq -r --arg key "$key" --arg cmd "$cmd" \
    '.dependencies[$key] // empty | sub("^[^#]*"; $cmd)' somefile.json

鉴于问题中的文档,上述内容将生成

some command#version2

如果dependencies子对象中没有键与给定$key值匹配,则该命令将不会产生任何输出。

答案2

获取值text2#version2

jq -r '.dependencies.name2' somefile.json
text2#version2

剪切第二个字段version2

jq -r '.dependencies.name2' somefile.json | cut -d# -f2
version2

执行命令command#version2

exec command#$(jq -r '.dependencies.name2' somefile.json | cut -d# -f2)

如果你想保留shell进程,可以替换exec为。eval

相关内容