代码之家  ›  专栏  ›  技术社区  ›  George Shuklin

如何折叠带标识的多行yaml字符串

  •  0
  • George Shuklin  · 技术社区  · 7 年前

    (在给出答案之前,请记住我已经尝试了这两种方法 > >-

    我试着在易变变量中发挥想象力。我想要一个格式良好的SQL(pseudo-SQL)查询被折叠成一行,而不需要新行字符。

    我的问题是 > 如果字符串具有标识,则运算符不起作用。。。

    ---
    - hosts: localhost
      gather_facts: no
      tasks:
       - debug: var=foo
      vars:
       foo: >
         select foo
           from bar
           where ok
         join left
           select baz
           from boo
    

    生产:

    ok: [localhost] => { "foo": "select foo\n from bar\n where ok\njoin left\n select baz\n from boo\n \n" }

    \n 在课文中间。单靠YAML powers能解决这个问题吗?

    0 回复  |  直到 7 年前
        1
  •  2
  •   flyx    7 年前

    是啊,这是亚姆最奇怪的特征。改用普通多行标量:

    ---
    - hosts: localhost
      gather_facts: no
      tasks:
       - debug: var=foo
      vars:
       foo:
         select foo
           from bar
           where ok
         join left
           select baz
           from boo
    
        2
  •  2
  •   Anthon    7 年前

    从YAML加载的数据中出现换行的原因是 YAML specification :

    折叠允许在单个空格字符分隔两个非空格字符的任何位置打断长行。

    既然前面有空格 from bar ,前一行的换行不能是“折页”,是硬换行。

    要单独使用YAML来“解决”这个问题,您可以尝试使用 plain style scalars 正如@flyx已经指出的,但是要注意对普通标量有一些限制,这些限制不适用于折叠标量。这些可能不适用于您的示例,但当您有真正的SQL语法时可能会适用。

    你可以做的另一件事是不要在折叠后缩进:

    foo: >
      select foo
      from bar
      where ok
      join left
      select baz
      from boo
    

    这并不能真正提高可读性,但没有普通风格标量的限制。

    foo: !flatten |
      select foo
        from bar
        where ok
      join left
        select baz
        from boo
    

    并为标签加载对象 !flatten