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

时间:2019-02-19 15:07:45

标签: ansible yaml

(在提供答案之前,请记住我已经尝试>>-都没有成功)。

我试图看中ansible变量。我想将一个格式正确的SQL(伪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功能解决此问题吗?

2 个答案:

答案 0 :(得分:1)

是的,这是YAML最奇怪的“功能”。改用普通的多行标量:

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

答案 1 :(得分:1)

您从YAML加载的数据中获取换行符的原因是根据YAML specification

  

折叠允许在单个空格字符将两个非空格字符分开的任何地方断开长行。

并且由于from bar之前有空格,因此之前一行的换行符不能位于“ fold”上并且是硬换行符。

要单独使用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加载对象,请在加载过程中适当展开以下几行(即用单行换行,然后用空格替换换行)。

尽管使用标签是IMO的最佳解决方案,但将术语“仅由YAML扩展”超出了合理范围。