如何将字符串分成多行?


1535

在YAML中,我的字符串很长。我想将其保留在编辑器的80列(或类似视图)内,所以我想破坏字符串。这是什么语法?

换句话说,我有这个:

Key: 'this is my very very very very very very long string'

我想要这个(或达到这种效果的东西):

Key: 'this is my very very very ' +
     'long string'

我想使用上述引号,因此不需要在字符串中转义任何内容。

Answers:


975

使用yaml折叠样式,每个换行符都被一个空格代替。每行的缩进将被忽略。一个换行符将插入到末尾。

Key: >
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with only a single carriage return appended to the end.

http://symfony.com/doc/current/components/yaml/yaml_format.html

您可以使用“块记录指示器”消除尾随换行符,如下所示:

Key: >-
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with NO carriage returns.

也有其他控制工具可用(例如,用于控制压痕)。

参见https://yaml-multiline.info/


谢谢,但是您似乎无法将此语法括在引号中:引号在结果字符串中显示为文字。
jjkparker 2010年

在我的应用翻译结束后,立即以某种方式添加了回车符。这样,JavaScript会将其视为多行并且失败。{{- 'key'|trans -}}也不起作用。
Rvanlaak 2015年

您将如何获得与列表中的值相同的效果?
Mikhail 2015年

每个换行符都被空格代替还是简单地删除了?
史蒂夫(Steve)

2
每个换行符都由空格 <- 代替,但双换行符将是换行符。
Jean Jordaan '18

3349

在YAML中有5 6 NINE(或63 *,取决于您的计数方式)不同的方式来编写多行字符串。

TL; DR

  • 通常,您想要>

    key: >
      Your long
      string here.
    
  • 如果您希望将换行符保留\n在字符串中(例如,带段落的嵌入式markdown),请使用|

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • 如果您不希望在末尾附加换行符,请使用>-|-代替。

  • 如果您需要在单词中间分割行或直接将换行符键入为\n,请使用双引号代替:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAML太疯狂了。

块标量样式(>|

这些允许使用诸如\"不进行转义的字符,并\n在字符串的末尾添加新行()。

> 折叠样式会删除字符串中的单个换行符(但在末尾添加一个,并将双换行符转换为单行):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| 文字风格将字符串中的每个换行符转换为文字换行符,并在末尾添加一个:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

这是YAML Spec 1.2中的官方定义

标量内容可以使用文字样式(用“ |”表示)以块符号表示,其中所有换行符均有效。另外,也可以用折叠样式(用“>”表示)来书写,其中每个换行符都被折叠到一个空格,除非它以空行或缩进的行结束。

块样式块咬食指示符(>-|->+|+

您可以\n\n通过添加块标记指示符来控制字符串中最后一行的处理以及任何尾随的空白行():

  • >|:“ clip”:保持换行,删除尾随的空白行。
  • >-|-:“ strip”:删除换行,删除尾随的空白行。
  • >+|+:“ keep”:保持换行,尾随空白行。

“流”标样式("'

这些具有有限的转义,并构造没有换行符的单行字符串。它们可以与键在同一行开始,也可以先添加其他换行。

普通样式(无转义,否#:组合,首字符限制):

Key: this is my very very very 
  long string

用双引号引起来的样式\并且"必须用进行转义\,换行符可以按原义\n顺序插入,行可以串联而后没有空格\):

Key: "this is my very very \"very\" loooo\
  ng string.\n\nLove, YAML."

"this is my very very \"very\" loooong string.\n\nLove, YAML."

单引号样式(字面量'必须加倍,没有特殊字符,可能对表示以双引号开头的字符串很有用):

Key: 'this is my very very "very"
  long string, isn''t it.'

"this is my very very \"very\" long string, isn't it."

摘要

在此表中,_space character\n表示“换行符”(\n在JavaScript中),但“行内换行”行除外,该行在字面上表示反斜杠和n)。

                      >     |            "     '     >-     >+     |-     |+
-------------------------|------|-----|-----|-----|------|------|------|------  
Trailing spaces   | Kept | Kept |     |     |     | Kept | Kept | Kept | Kept
Single newline => | _    | \n   | _   | _   | _   | _    |  _   | \n   | \n
Double newline => | \n   | \n\n | \n  | \n  | \n  | \n   |  \n  | \n\n | \n\n
Final newline  => | \n   | \n   |     |     |     |      |  \n  |      | \n
Final dbl nl's => |      |      |     |     |     |      | Kept |      | Kept  
In-line newlines  | No   | No   | No  | \n  | No  | No   | No   | No   | No
Spaceless newlines| No   | No   | No  | \   | No  | No   | No   | No   | No 
Single quote      | '    | '    | '   | '   | ''  | '    | '    | '    | '
Double quote      | "    | "    | "   | \"  | "   | "    | "    | "    | "
Backslash         | \    | \    | \   | \\  | \   | \    | \    | \    | \
" #", ": "        | Ok   | Ok   | No  | Ok  | Ok  | Ok   | Ok   | Ok   | Ok
Can start on same | No   | No   | Yes | Yes | Yes | No   | No   | No   | No
line as key       |

例子

请注意“空格”之前一行的尾随空格。

- >
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- | 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- "very \"long\"
  'string' with

  paragraph gap, \n and        
  s\
  p\
  a\
  c\
  e\
  s."
- 'very "long"
  ''string'' with

  paragraph gap, \n and        
  spaces.'
- >- 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.

[
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces.\n", 
  "very \"long\"\n'string' with\n\nparagraph gap, \\n and        \nspaces.\n", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces."
]

带缩进指示器的块样式

以防万一上述内容不足以满足您的需要,您可以添加一个“ 块缩进指示器 ”(如果您有一个块,则在块切割指示器之后):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here

附录

如果您以折线样式在非第一行的开头插入多余的空格,则会保留这些空格,并带有额外的换行符。流样式不会发生这种情况:

- >
    my long
      string
- my long
    string

["my long\n string\n", "my long string"]

我什至不能

*2种块样式,每种都有2种可能的块标记(或没有),以及9种可能的缩进指示(或没有),1种普通样式和2种带引号的样式:2 x(2 + 1)x(9 +1)+1 + 2 = 63

这些信息中的一些也已在此处进行了总结。


28
在这63种语法中,您是否认为有一种语法可以让您在多行中拼写一个不应包含换行符或空格的字符串?我的意思是说,"..." + "..."在大多数编程语言中会写什么,或者在Bash中在换行符前加反斜杠。
托比亚

23
@pepoluan我想尽一切可能的组合,只找到了一个允许spaceless串联:字符串周围放置双引号和换行符之前的反斜线例如:数据:text / plain的; BASE64,dGVzdDogImZvb1wKICBiYXIiCg ==(和缩进。)
托比亚

41
相反,@ wvxvw,我认为YAML是许多常见用例(例如,配置文件)中最差的格式,尤其是因为大多数人被其表面上的简单性所吸引,直到后来才意识到它是一种极其复杂的格式。YAML使错误的事物看起来正确-例如,:字符串数组中一个字符串内的纯冒号使YAML将其解释为对象数组。它违反了最小惊讶原则
Vicky Chijwani,

19
有人制作了有关此主题的网站:yaml-multiline.info @SteveBennettㄹ如果您不知道,请检查该页面的页脚。
乌冬丹18-3-4

37
另一个多行字符串语法
xdhmoore

186

要保留换行符,请使用|,例如:

|
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with newlines preserved.

译为“这是一个很长的句子‌ \ n,它跨越YAML‌ \ n中的几行,但是将被呈现为字符串‌ \ n并保留换行符。\ n


这对我来说两行似乎行得通,而三行行不通吗?
cboettig

谢谢,就像您说的那样,在这里工作正常。出于某种原因,在Pandoc的yaml标头中,我需要|在每一行上重复该操作,原因对我而言并不明显:groups.google.com/forum
#!topic/pandoc

1
本示例不会在rails 4中转换为新行!
Rubytastic,

如果我写:-field1:|不是问题。一二-field1:| 我得到三个:一个\ n两个\ n和三个\ nfor?我希望\ n 2以后不出现在其中……
Alain1405 2014年

当将多行cat与定界符一起使用时,这会导致将前导空格(YAML必需)添加到输出中。
Karl Richter

109

1.块符号(普通,流式,标量): 删除块后,换行符变为空格,多余的换行符

---
# Note: It has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

等效JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2.文字块标量: 文字块标量|将包括换行符和任何尾随空格。但删除了多余的

换行符。

---
# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  


...

等效JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. +具有文字块标量的指示器:在块后保留额外的换行符

---
# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.


...

等效JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. –具有文字块标量的指示符: 表示删除字符串末尾的换行符。

---
# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.


...

等效JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5.折叠块标量(>):

会将换行符折叠到空格,但在块后删除多余的换行符。

---
folded_newlines: >
 this is really a
 single line of text
 despite appearances


...

等效JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

有关更多信息,请访问我的博客


例如,您是否打算让#4在冒号后面使用“ |-”?另外,由于您仅显示一个文档,因此您可能会在此处丢失“ ---”指令结束标记。文档结束标记有助于突出显示文档中的尾随空白。但是除此之外,不需要明确的文档。
seh

感谢您指出。那是一个错字。一个已经解决了。我提供了开始和结束标记,以便每个人都可以在字符串后看到新行。
Arayan Singh '18

在YAML规范中,Nr.1被描述为普通的流式标量。称其为块样式会产生误导。
Anthon '18年

将Nr.1更改为普通的流式标量。
Arayan Singh

42

您可能不相信,但是YAML也可以执行多行键:

?
 >
 multi
 line
 key
:
  value

3
需要说明(什么是“?”)。
ilyaigpetrov

@ilyaigpetrov与编写的“多行”键完全相同。通常,您会执行类似的操作key:value,但是如果您的密钥包含换行符,则可以如上所述进行操作
goFrendiAsgard

4
现实中的用例的任何示例吗?
理查德·迪根

1
@ilyaigpetrov ?是关键指标(如映射中的关键一样)。在许多情况下,当键后的(必需)值指示符:变得明确时,您可能会省略键指示符。但是事实并非如此,您必须使用它来显式标记密钥。
Anthon '18年

42

要连接没有空格的长行,请使用双引号,并使用反斜杠转义换行符:

key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
  orincididuntutlaboreetdoloremagnaaliqua."

(感谢@Tobia)


谢谢,这确实帮助我在多行中定义了Docker卷!如果有人遇到
Mike Mitterer

终于啊 我试图在多行中将长ssh密钥包装在Puppet的Hiera yaml文件中,但是在我使用您的答案之前,总是会有多余的空格。谢谢。
马丁·海姆斯

18

如果您在Symfony中使用YAML和Twig进行翻译,并且想在Javascript中使用多行翻译,则在翻译后立即添加回车符。因此,即使是以下代码:

var javascriptVariable = "{{- 'key'|trans -}}";

其中yml翻译如下:

key: >
    This is a
    multi line 
    translation.

仍将导致以下html代码:

var javascriptVariable = "This is a multi line translation.
";

因此,Twig中的减号不能解决此问题。解决方案是在yml中的大于号后添加此减号:

key: >-
    This is a
    multi line 
    translation.

将获得正确的结果,在Twig中的一行上进行多行翻译:

var javascriptVariable = "This is a multi line translation.";

这看起来像个错误。您是否有机会提交错误报告?
dreftymac '16

8

对于字符串可能不包含空格的情况,我更喜欢双引号和带有反斜杠的行继续:

key: "String \
  with long c\
  ontent"

但是请注意,对于连续线以空格开头的情况,陷阱是必须转义的(因为它将在其他地方被剥离):

key: "String\
  \ with lon\
  g content"

如果字符串包含换行符,则需要以C样式编写\n

另请参阅此问题


如果剥离了 其他地方,即不是在那个位置,你能不能更新有关信息,你的答案在那里将被剥夺。还请写哪个解析器(针对哪种语言)?我只看到解析器在多行引号字符串中去除了这样的前导/后缀空格。
Anthon '18年

0

在Jekyll项目中的YAML文件中,以上解决方案均不适用于我。在尝试了许多选项之后,我意识到使用HTML注入<br>也可以这样做,因为最终所有内容都呈现为HTML:

姓名:| 在拉曼恰(La Mancha)村,<br><br>不想记住这个名字。

至少对我有用。不知道与这种方法相关的问题。


2
您的解决方案涉及另一个问题:在您的情况下,由于处理YAML,您希望换行符出现在呈现的HTML中。HTML和YAML彼此之间没有隐式关系。即使YAML通过常规换行符,HTML也会忽略它们。最终,op的问题与在YAML本身中使用换行符有关,只是为了防止行很长。它并不关心最终如何呈现数据。为什么要告诉这个?因为这解释了为什么此处给出的所有其他解决方案在您的情况下不起作用。
托马斯·厄本
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.