将 YaML 流样式转换为 YaML 块样式

问题描述 投票:0回答:2

我有一些原来是 JSON 的大型 YAML 文件,因此它们采用 YAML 流样式。例如

{
    "foo":
    {
        # Some comment
        "bar": "baz", # Another comment
        "qux" : [
            1,
            2,
            3
        ]
    },
    # ...
}

我想将它们转换为 YaML 块样式,保留注释和(如果可能)对象键排序。例如

foo:
  # Some comment
  bar: baz # Another comment
  qux:
    - 1
    - 2
    - 3
# ...

这可行吗?

yaml
2个回答
0
投票

这是绝对可行的;我可以立即想到两种方法。如果您是熟练的编码员,则可以使用您选择的语言读取现有的 YAML 文件,然后以正确的格式写出文件。

或者,您可以使用您喜欢的文本编辑器删除多余的字符等并清理文件。不过可能会很辛苦。

最后一个选项,我不推荐但我觉得我有义务提及,是使用正则表达式来转换文件。这可能是可能的,但会非常复杂。我建议选择A。


0
投票

我刚刚踩了你的帖子,你可以用这句话达到想要的结果:

sed --regexp-extended 's/#(.*)/"commnet": "\1",/g' <YOUR INPUT FILE> \
  | yq --input-format json --output-format yaml \
  | sed --regexp-extended "s/comment\: '(.*)'/#\1/g"

细分:

  1. sed --regexp-extended 's/#(.*)/"comment": "\1",/g'
    - 将所有评论转换为 json 有效的内容,这样 yq 就不会抱怨,
  2. yq --input-format json --output-format yaml
    - 使用 yq,
  3. 将 json 转换为 yaml
  4. sed --regexp-extended "s/comment\: '(.*)'/#\1/g"
    - 将评论转换回
    # ...
    形式。

可能的坑是你输入的 JSON 中的任何

comment
字段都会被转换为
# ...

© www.soinside.com 2019 - 2024. All rights reserved.