【问题标题】:Get keys from yaml file using bash [duplicate]使用 bash 从 yaml 文件中获取密钥 [重复]
【发布时间】:2022-01-28 21:46:43
【问题描述】:

假设我有一个这样的 yaml 文件:

env:
 firstVar: true
 secondVar: 20
 aa_thirdVar: 'hello'
 aa_fourthVar: false

并且我需要获取 env 键下的键,除了带有 aa_ 前缀的键作为 bash 数组,以便在 bash 脚本中使用该数组。我需要使用诸如sedawk 等标准 Linux 工具来执行此操作,而无需外部依赖。如何做到这一点?

【问题讨论】:

  • 不幸的是,这个答案更笼统。在发布我的之前,我探索了可用的问题/答案。
  • 结果数组是什么? ([firstvar]="true" [secondVar]="20")?
  • 结果数组应该只包含没有 aa_ 前缀的键,例如 ARR=(firstVar, secondVar)。

标签: bash shell


【解决方案1】:

第一件事是产生key=value对。

您可以将ruby 与内置的 yaml 解析器一起使用:

ruby -r yaml -e 'data=YAML.load($<.read)
data["env"].
    select{|k,v| k.to_s.match(/^(?!aa)/)}.
    each{|k,v| puts "#{k}=#{v}"}
' file

或者,更脆弱,你可以使用这个awk

awk '
/^env:/{con=$1; next}
$1~/aa_/{next}
con=="env" 
{sub(/:$/,"",$1); print $1 "=" $2}' file

这些印刷品中的任何一个:

firstVar=true
secondVar=20 

现在有一个 Bash 循环,它将 key=value 类型对添加到关联数组 aa,如下所示:

declare -A aa
while IFS="=" read -r k v; do
    echo "$k $v"
    aa["$k"]="$v"
done < <(ruby -r yaml -e 'data=YAML.load($<.read)
data["env"].
    select{|k,v| k.to_s.match(/^(?!aa)/)}.
    each{|k,v| puts "#{k}=#{v}"}
' file)

结果:

declare -p aa

打印:

declare -A aa=([firstVar]="true" [secondVar]="20" )

【讨论】:

    【解决方案2】:

    我使用 yq,它是 jq 工具的包装器 https://github.com/kislyuk/yq

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2012-10-31
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2021-10-19
      相关资源
      最近更新 更多