如何用输入填充值

How to populate value with input

从 composer.lock 我正在创建一些字段的 json 输出,如下所示:

 <composer.lock jq  '.packages[] | {site: "foo", name: .name, version: .version, type: .type}' | jq -s

它工作正常:

  {
    "site": "foo",
    "name": "webmozart/path-util",
    "version": "2.3.0",
    "type": "library"
  },
  {
    "site": "foo",
    "name": "webonyx/graphql-php",
    "version": "v14.9.0",
    "type": "library"
  }

但现在我想使用 uuidgen 添加生成的值,但我不知道该怎么做。

最终结果会是这样的:

  {
    "site": "foo",
    "name": "webmozart/path-util",
    "version": "2.3.0",
    "type": "library",
    "uuid": "c4e97c3c-147d-4360-a601-6b4f6f5e71bb"
  },
  {
    "site": "foo",
    "name": "webonyx/graphql-php",
    "version": "v14.9.0",
    "type": "library",
    "uuid": "6fbe472b-49fe-4064-93f0-09a18a7e1c24"
  }

我想我应该使用输入法,但到目前为止我尝试的所有方法都失败了。

这是一种不需要您的 shell 支持“进程替换”但需要两次通过的可能性,第一次用于确定所需的 UUID 数量:

# Syntax: generate N
function generate {
    for ((i=0; i<; i++)) ; do
    uuidgen
    done
}    

generate $( <composer.lock jq '.packages|length') | 
  jq -nR --argfile input composer.lock  '
    ($input 
    | .packages[]
    | {site: "foo", name: .name, version: .version, type: .type,
       id: input})'

如果您的 shell 支持进程替换,您可以避免以下两遍解决方案:

jq -nR  --argfile input composer.lock '
  $input 
  | .packages[]  
  | {site: "foo", name: .name, version: .version, type: .type, id: input}
 ' < <(while true; do uuidgen; done)

这里的重点是,如上使用进程替换,“消费者”(jq)的终止也将终止UUID的“生产者”。