【问题标题】:How do I use awk to modify a yml file?如何使用 awk 修改 yml 文件?
【发布时间】:2021-02-23 23:33:58
【问题描述】:

我正在尝试使用awk 来修改 yml 文件。我想要的逻辑是,如果键 specialKey 已经存在与子键 subkey 则什么都不做,否则我想在特殊键下插入子键(及其关联值)。例如,如果我的文件 mine.yml 看起来像

blah:
   moreStuff:
      ...
specialKey:
   A:
      ...
   B:
      ...
   subKey:
      ...
   C:
      ...
...

然后什么都不做,因为specialKey 已经存在,subkey 作为子键。但如果它丢失了,那么我希望插入specialKey: ...。我无法理解如何使用 awk,这是我的第一次尝试:

awk '1;/specialKey:/{foundSpecialKey=1;}; foundSpecialKey && /subKey:/{foundSubKey=1}; foundSpecialKey && foundSubkey!=1 && //{foundLifecycle=0; foundResults=0; print "my content";}' mine.yml

但是即使specialKey: ... subKey: ... 已经存在,它仍然会插入到内容中。我该如何继续?

【问题讨论】:

  • 不要。使用理解 yaml 的工具,例如几个(不相关且彼此不兼容,唉)yq 程序之一。
  • 同意找到一个 yaml 工具,但您的初始条件 1; 对于读取的每一行都评估为 true,因此将打印每一行(可能重复)。祝你好运。

标签: shell unix awk


【解决方案1】:

试试这个:

awk '/^[[:alnum:]]/ && NR==FNR 
                              { 
                                key=$0 
                              } 
key=="specialKey:" && NR==FNR 
                              { 
                                if (match($0,/subKey:/)) 
                                                        { 
                                                          mtch=1 
                                                        } 
                              } 
 NR!=FNR && mtch!=1 && /^specialKey:/ 
                              { 
                                print $0;
                                print "   subKey:";
                                print "      ..." 
                              } 
 NR!=FNR && mtch==1 
                              { 
                                 print $0 
                              } 
 NR!=FNR && mtch!=1 && !/^specialKey:/ 
                              { 
                                 print $0 
                              }' mine.yml mine.yml

两次处理 yaml 文件。在第一遍(NR==FNR)中,我们确定子密钥是否存在。然后在第二遍 (NR!=FNR) 中,如果我们在前一遍 (mtch!=1) 中没有找到子键的匹配项,我们会在以“specialKey:”开头的行下打印子键。在所有其他情况下,我们只打印该行

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2016-04-29
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2011-01-10
    相关资源
    最近更新 更多