「译文」如何在 YAML 中输入多行字符串?

本文最后更新于:2024年7月24日 晚上

👉️URL: https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines

📝Description:

In YAML, I have a string that’s very long. I want to keep this within the 80-column (or so) view of my editor, so I’d like to break the string. What’s the syntax for this?

问题

在 YAML 中,我有一个非常长的字符串。我希望将其保存在编辑器的 80 列 (大约) 视图中,因此我想中断字符串。它的语法是什么?
换句话说,我有:

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

我想要这样(或类似的效果):

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

我想像上面那样使用引号,所以我不需要转义字符串中的任何内容

答案

在 YAML 中有很多不同的方法来编写多行字符串。

TL;DR

符号 >

大多数情况下使用: > 去掉内部换行符,但是在末尾会有一个换行符:

1
2
3
key: >
Your long
string here.

符号 |

如果您希望这些换行符保持为\n(举例,就是嵌入段落的标记),请使用|

1
2
3
4
5
key: |
### Heading

* Bullet
* Points

>-|-

如果不希望在末尾追加换行符,则使用>-|-.

符号 ""

如果你需要在单词中间分隔行,或者想按字面意思键入换行符\n:

1
2
key: "Antidisestab\
lishmentarianism.\n\nGet on it."

YAML 太诡异了🤬🤬🤬

块标量样式(>|)

它们允许像 \"这样的字符不需要转义,并在字符串的末尾添加一个新行(\n)。

> 折叠样式 删除了字符串中的单个换行符(但在结尾处增加一个,并将双换行符转换为单换行符)。

1
2
3
Key: >
this is my very very very
long string

结果是: this is my very very very long string\n

额外的前导空间被保留并导致额外的换行符。请参阅下面的注意。

👍️ 建议:

字符串 wrap line 使用这个。通常这就是你想要的。

| 字面风格 将字符串中的每一个换行 (newline) 都变成一个字面换行(literal newline),并在最后加上一个换行。

1
2
3
Key: |
this is my very very very
long string

结果是: this is my very very very\nlong string\n

下面是 YAML 规范 1.2 的官方定义:

📚️ Reference:

标量内容可以用块状符号来写,使用字面风格(用 | 表示),其中所有的换行符都是显式的。另外,也可以使用折叠式风格(用 > 表示),其中每个换行符都被折叠成一个空格,除非它结束了一个空行或一个缩进较大的行。

👍️ 建议:

将格式化的文本 (特别是 Markdown) 作为值插入使用这个 |

带有块咬合指示器 (block chomping indicator) 的块状样式(>-, |-, >+, |+)

你可以通过添加一个 块咬合指示符 字符来控制字符串中最后一个新行和任何尾随空行 (\n\n) 的处理:

  • >, |: “剪辑(clip)”: 保留换行,删除末尾空行。
  • >-, |-: “strip”: 删除换行,删除末尾的空行。
  • >+, |+: “keep”: 保持换行,末尾为空行。

“流(Flow)”标量风格 ( , ", ')

它们有有限的转义,并构造一个没有新行字符的单行字符串。它们可以在与键相同的行开始,或者在前面附加换行符,这些换行符被剥离。双行换行符变成一个换行符。

plain style(没有转义,没有 #:组合,第一个字符不能是 "' 或许多其他标点字符):

1
2
Key: this is my very very very 
long string

👍️ 建议:

避免这样用。可能看起来很方便,但你可能会因为不小心使用了禁用的标点符号而搬起石头砸自己的脚,并引发语法错误。

双引号风格 (\"必须被 \ 转义,换行符可以用一个 \n 序列插入,行可以不带空格的 \ 结尾连接)

结果是:

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

👍️ 建议:

仅在非常具体的情况下使用。这是唯一可以在不添加空格的情况下将一个很长的标记 (如 URL) 跨行分隔的方法。也许在中间添加换行符是很有用的。

单引号风格 (Literal ' 必须是成对的,没有特殊字符,可能用于表达以双引号开头的字符串):

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

结果是: "this is my very very \"very\" long string, isn't it."

👍️ 建议:

避免。很少有好处,大多是不便。

带 缩进指示器的块样式

如果上面的内容对你来说还不够,你可以添加一个“块缩进指示符”(如果你有块咬合指示符的话,在你的块咬合指示符之后):

1
2
3
4
5
6
- >8
My long string
starts over here
- |+1
This one
starts here

注: 前导空格采用折叠样式(>)

如果你以折叠的方式在非首行开始插入额外的空格,它们将被保留,并带有额外的换行符。(这种情况不会发生在流样式上。)第 6.5 节:

📚️ Reference:

此外,折叠不适用于包含前导空格的文本行周围的换行符。注意,这种更缩进的行可能只包含这样的前导空格。

1
2
3
4
5
6
7
8
9
- >
my long
string

many spaces above
- my long
string

many spaces above

结果是: ["my long\n string\n \nmany spaces above\n","my long string\nmany spaces above"]

总结😵😵😵

在该表中,_表示空格字符。\n表示“换行符”(在 JavaScript 中为\n),“其他功能”下除外。“前导空格”应用于第一行之后(建立缩进):

| | > | | | | " | ' | >- | >+ | | - | | + |
| :------------------------ | :— | :— | :— | :— | :— | :— | :— | :— | ---- |
| 空格或换行转换为: | | | | | | | | | |
| 尾部空格 → | _ | _ | | | | _ | _ | _ | _ |
| 头部空格 → | \n_ | \n_ | | | | \n_ | \n_ | \n_ | \n_ |
| 单空行 → | _ | \n | _ | _ | _ | _ | _ | \n | \n |
| 双空行 → | \n | \n\n | \n | \n | \n | \n | \n | \n\n | \n\n |
| 最后空行 → | \n | \n | | | | | \n | | \n |
| 最后双空行 → | | | | | | | \n\n | | \n\n |
| 如何创建一个 literal: | | | | | | | | | |
| 单引号 | ’ | ’ | ’ | ’ | ‘’ | ’ | ’ | ’ | ’ |
| 双引号 Double quote | " | " | " | " | " | " | " | " | " |
| 反斜杠 | \ | \ | \ | \ | \ | \ | \ | \ | \ |
| 其他功能 | | | | | | | | | |
| 使用 n 的行内换行符 | 🚫 | 🚫 | 🚫 | ✅ | 🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
| 带 \ 的无空格换行符 | 🚫 | 🚫 | 🚫 | ✅ | 🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
| value 中 的 #: | ✅ | ✅ | 🚫 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 可以与 key 在同一行上开始 | 🚫 | 🚫 | ✅ | ✅ | ✅ | 🚫 | 🚫 | 🚫 | 🚫 |

示例🥴🥴🥴

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
- >
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."
]

「译文」如何在 YAML 中输入多行字符串?
https://ewhisper.cn/posts/15077/
作者
东风微鸣
发布于
2022年3月24日
许可协议