如何自动重新缩进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文件,无法再正确解析生成的文件。我看到的两种解决方案是:
您似乎想做的是确保YAML文件统一缩进(例如,在签入修订控制系统之前)。如果将结构扁平化,则会丢失信息,因此您的去齿然后重新缩进的想法将不起作用。这:
foo:
alice: female
bob: male
由两个映射组成:一个具有一个键的映射和一个将两个键映射为两个值的值
这:
是一个具有三个键的映射,键foo
的值为空标量(除了空字符串之外,也可写,如YAML文件中的~
,null
,null
)
大多数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