【问题标题】:Update YAML file specific components in bulk批量更新 YAML 文件特定组件
【发布时间】:2020-10-04 15:02:26
【问题描述】:

我想为第一级中的所有倒数第二个组件批量更新我的 YAML 文件。像这样的:

Zero-level:
  First-level-1:
    - Key1: AAA
    - Key2: BBB
  First-level-2: <<< I want to change the name of all second last components
  First-level-3:

我过去使用sed通过识别关键字来批量更新文件夹内所有文件中的特定关键字,如下所示:

sed -i 's/XXX: XXX/XXX: YYY/g' *

但是对于这种情况,我想识别第一级数组的每一秒的最后一项。其中的值可能不同。此外,不同的文件可能具有不同数量的第一级项目。文件A可能是这样的:

Zero-level:
  First-level-1:
    - Key1: AAA
    - Key2: BBB
  First-level-2: <<< I want to change the name of all second last components
  First-level-3:

文件B可能是这样的:

Zero-level:
  First-level-1:
    - Key1: AAA
  First-level-2:
    - Key1: BBB
  First-level-4:
  First-level-5:
  First-level-6:
  First-level-7: <<< I want to change the name of all second last components
  First-level-8:

'First-level-2' 的文件 A 名称和文件 B 的 'First-level-7' 都应更改为我想要的新名称。

有什么方法可以探索吗?

谢谢

【问题讨论】:

  • 不要使用sed来解析YAML!你能下载像yq这样的外部工具吗?

标签: bash unix vim sed yaml


【解决方案1】:

使用正则表达式处理 yaml 是有风险的。例如,具有多行的值可能会破坏解决方案。

但是,如果您确定文件的所有格式都符合您问题中的格式,您可以尝试一下:

tac your.yml| awk '/^  \S/{++c}c==2{$0="  new-name: newvalue"}7' |tac

缩进在 yaml 中很重要,因此您应该在其中放置正确数量的空格。在示例中,我放置了两个空格。

【讨论】:

    【解决方案2】:

    如果ed 可用。

    #!/usr/bin/env bash
    
    replacement=Aloha!
    
    for f in ./*.yml; do
      printf '%s\n' '$-1,s/First.*/'"$replacement/" ,n Q | ed -s "$f"
      echo
    done
    
    • 正如 Inian 所说,为 yaml 文件使用适当的解析器,这只是最后的手段。

    • ,n只是显示行号,不会影响实际文件。

    • 前导./ 表示当前目录,它也是以破折号- 开头的文件的保护

    • $-1 是倒数第二行,$ 是最后一行。

    • 如果您认为输出正确,请将Q 更改为w,只需确保您有备份,因为w 将就地编辑文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多