将一个文件中的值添加到另一个文件中的列表中

Adding values from one file into a list in another file

使用 Mike Farah's YQ,我试图将标准输入中的某些值合并到文件中的列表中。

我目前使用的命令是:

yq ea -i '(select(fi==0).masterZones) += [(select(fi==1).AvailabilityZones[].ZoneName)]' test.txt -

为简洁起见,test.txt 中不存在 masterZones。标准输入的截断版本是:

AvailabilityZones:
- GroupName: us-east-1
  ZoneName: us-east-1a
- GroupName: us-east-1
  ZoneName: us-east-1b
- GroupName: us-east-1
  ZoneName: us-east-1c

我的输出类似于:

a: foo
b: bar
masterZones:
  - us-east-1a
  - us-east-1b
  - us-east-1c
---
AvailabilityZones:
- GroupName: us-east-1
  ZoneName: us-east-1a
- GroupName: us-east-1
  ZoneName: us-east-1b
- GroupName: us-east-1
  ZoneName: us-east-1c

我想了解如何只添加列表,以及为什么它将标准输入附加到文件中,而不只是我的 select 子句。我觉得我想做的事情需要一些 ireduce 魔法,这有点超出我的想象,但也许我只是在 eval 中遗漏了一些东西——将整个 stdin 附加到我的文件中的所有东西?

如果您打算在 test.txt 上新创建 masterZones 或完全覆盖其中存在的值,您可以这样做

yq ea '
( 
  ( 
    select(fi==0).AvailabilityZones[].ZoneName ) as $item ireduce([]; . + $item
  ) 
) as $ma 
| select(fi == 1) | .masterZones += $ma ' - test.txt

想法是将来自标准输入的区域名称值存储到一个数组中(整个操作使用 ireduce),并在测试文件上创建一个新路径 masterZones 来更新数组值。