如何自动重新缩进YAML文件? 让我们考虑这个例子: --- foo: alice: female bob: male bar: - node: 42 name: none - node: 43 name: none

如何自动重新缩进YAML文件? 让我们考虑这个例子: --- foo: alice: female bob: male bar: - node: 42 name: none - node: 43 name: none,yaml,Yaml,如果我决定重做一切并从这开始: --- foo: alice: female bob: male bar: - node: 42 name: none - node: 43 name: none 我没有足够的信息来做这件事。实际上,vim的尝试是: --- foo: alice: female bob: male bar: - node: 42 name: none - node: 43 name: none Ansible也做不到: --- foo: alice:

如果我决定重做一切并从这开始:

---
foo:
alice: female
bob:   male
bar:
- node: 42
name: none
- node: 43
name: none
我没有足够的信息来做这件事。实际上,vim的尝试是:

---
foo:
    alice: female
bob:   male
bar:
    - node: 42
name: none
- node: 43
name: none
Ansible也做不到:

---
foo:

alice: female
bob:   male
bar:

- node: 42
  name: none
  - node: 43
    name: none
我认为一个可能的解决方法是在缩进增加时添加一个空行:

---
foo:

  alice: female
  bob:   male
bar:

  - node: 42
    name: none
  - node: 43
    name: none
在我看来,YAML的主要问题是人们仍然在为制表符、空格和缩进大小而斗争。对于由多人编辑的大型YAML文件,无法再正确解析生成的文件。我看到的两种解决方案是:

  • 仅使用制表符和强制制表符标识,因为Makefiles就是这种情况
  • 上述解决方案

  • 您似乎想做的是确保YAML文件统一缩进(例如,在签入修订控制系统之前)。如果将结构扁平化,则会丢失信息,因此您的去齿然后重新缩进的想法将不起作用。这:

    foo:
      alice: female
      bob:   male
    
    由两个映射组成:一个具有一个键的映射和一个将两个键映射为两个值的值

    这:

    是一个具有三个键的映射,键
    foo
    的值为空标量(除了空字符串之外,也可写,如YAML文件中的
    ~
    null
    null

    大多数YAML解析器在将文件读入内部数据时会丢失信息:

    • 评论被删除
    • 映射不保留键顺序
    • 标量周围的额外空格不保留
    Python包(我是其作者)是一个增强的解析器,它允许将YAML文件往返于数据和YAML,以保留更多的原始信息。它将保留注释和键顺序,但会减少单行标量周围的额外间距

    此往返通常在第二次往返时稳定,因此可用于重新插入YAML文件。软件包中包含的
    yaml
    实用程序可用于此目的,而无需自行编程:

    yaml round-trip your_file.yml --verbose
    
    往返
    可以缩短为
    rt
    )将检查文件是否会更改以及如何更改。如果它真的改变了,它会显示一个错误。基于此,如果文件稳定,您可以决定保存该文件:

    yaml round-trip your_file.yml --save
    
    example.yml
    的输出:

    ---
    foo:
      alice: female  # verified
      bob:   male
    bar:
    - node:   42
      name: none
    -     node: 43
          name: none
    
    将是:

    example.yml:
         stabilzes on second round trip, ok without comments
    --- example.yml
    +++ round trip YAML
    @@ -1,9 +1,9 @@
     ---
     foo:
       alice: female  # verified
    -  bob:   male
    +  bob: male
     bar:
    -- node:   42
    +- node: 42
       name: none
    --     node: 43
    -      name: none
    +- node: 43
    +  name: none
    
    保存时,您会看到:

    ---
    foo:
      alice: female  # verified
      bob: male
    bar:
    - node: 42
      name: none
    - node: 43
      name: none
    

    默认情况下,缩进级别为2,但可以使用选项设置为
    yaml

    我刚刚找到另一个解决方案,它需要两个正则表达式替换

    首先选择yaml中未包含的单个字符。我用了“°”

    在这里,我想将4个空间改为2个空间:

    搜索正则表达式“
    ^(()*)()
    ”(大括号中有4个空格)并替换为“
    $1°
    ”,直到没有任何可替换的内容

    将所有“
    ”替换为“
    ”(2个空间)。。 瞧

    发生的情况是,最右边的缩进被占位符子顺序替换。为避免已替换内容的不正确匹配,需要与搜索不匹配的占位符


    PS:我知道它不是完全自动化的,但大多数编辑器都有regex replace,因此不需要额外安装。

    使用正则表达式替换可以轻松地更改缩进,许多编辑器都支持这一点。如果您首先删除缩进,您将丢失信息。当然,在此之后,您无法恢复YAML文件的初始含义。+1用于使用良好的IDE。在使用YAML和Coffeescript等以空格分隔的系统时,还需要有一致的标准(即2个空格或4个实际空格字符或制表符)。您描述的问题只是我仍然喜欢JSON或JSON的原因之一JavaScript@PhillipHolmes你的评论很中肯。我想这一切背后的真正问题是:选择什么,JSON、INI还是YAML?如果编写自己的系统?基于分隔符(即JSON)的结构-进入的障碍可能更高,但对多人使用同一代码的总体好处远远好于为一个“一人”团队提供服务。我不认为不能处理少量复杂性的人应该像DevOps所要求的那样参与复杂的任务(你提到了Ansible,这就是我最初看到这篇文章的原因;)。也就是说,Ansible使用YAML,因此YAML被使用,超过1的团队需要以相同的方式工作,而不管个人喜好如何……我通过Ubuntu 16.04LTS上的
    pip
    安装了ramuel.YAML包,但我找不到
    YAML
    实用程序。YAML实用程序在包
    ruamel.YAML.cmd
    中,
    ruamel.yaml
    只有库。此策略在Rstudio中使用
    \1°
    作为替换字符串。
    ---
    foo:
      alice: female  # verified
      bob: male
    bar:
    - node: 42
      name: none
    - node: 43
      name: none