YAML 因其简洁性和可读性,成为配置文件、数据序列化的热门选择。当需要处理包含换行符的长字符串(如段落文本、代码片段、日志信息等)时,YAML 提供了两种强大的标量块样式:字面块 (|
) 和 折叠块 (>
)。它们允许你以更自然、易读的方式在 YAML 文件中编写多行文本。
直接在 YAML 值中使用换行符通常会导致语法错误或解析困难。例如:
# 错误示例:直接换行不被允许(除非在引号内,但引号内换行处理复杂)
description: 这是第一行
这是第二行 # 语法错误!
使用双引号 "
或单引号 '
虽然可以包含换行符,但需要转义特殊字符(双引号内),并且处理内部引号和长文本时易读性较差:
# 使用双引号(可包含换行,但需要转义内部双引号和反斜杠,阅读困难)
description: "这是第一行。\n这是第二行,包含一个\"引号\"。\n第三行。"
|
和 >
解决了这些问题,它们:
\n
显式表示换行。|
|
后跟换行符开始。code_snippet: |
def hello_world():
print("Hello, World!")
# 这是一个注释
if True:
print("YAML blocks are useful!")
# 解析后的值(Python 示例):
# "def hello_world():\n print(\"Hello, World!\")\n # 这是一个注释\n if True:\n print(\"YAML blocks are useful!\")\n"
# 注意:保留了所有缩进、换行和行尾的注释。
>
>
后跟换行符开始。\
: 如果一行以非转义的反斜杠 \
结尾,则该行不会折叠到下一行(即该换行符被保留),并且反斜杠会被移除(除非它被转义 \\
)。|
相同)。\
结尾的行会创建新的行。\
)。description: >
This is the first sentence of a paragraph.
This is the second sentence, which will be joined
to the first with a space. It's much easier to read
in the YAML file this way.
This is a new paragraph because there was an empty
line above. It will be separated by a newline.
This line ends with a single backslash \
so the next line starts on a new line. The backslash is removed.
# 解析后的值(Python 示例):
# "This is the first sentence of a paragraph. This is the second sentence, which will be joined to the first with a space. It's much easier to read in the YAML file this way.\n\nThis is a new paragraph because there was an empty line above. It will be separated by a newline.\nThis line ends with a single backslash so the next line starts on a new line. The backslash is removed.\n"
# 注意:
# - 第一段的所有非空行被折叠成一个长句(空格连接)。
# - 两个空行(在YAML块中)变成了两个换行符 `\n\n`,分隔段落。
# - 以 `\` 结尾的行:反斜杠被移除,该行与下一行之间的换行符被保留(即 `\n` 出现在 `backslash` 和 `so` 之间)。
|
vs >
)特性 | |(字面量块) |
|
---|---|---|
换行保留 | 保留所有换行 | 将换行转换为空格(除非是空行) |
最终结果 | 多行字符串(带换行) | 单行或段落式字符串(带空格) |
适合内容 | 脚本、配置段、代码块 | 描述文字、段落性说明文本 |
阅读体验 | 更易于阅读格式化内容 | 更紧凑,节省行数 |
尾部换行控制 | 支持 |-, |+ | 支持 >-, >+ |
空行处理 | 原样保留 | 保留段落(空行)分隔 |
|
或 >
) 统一缩进。这个缩进级别定义了“块内容的起始列”。\n
)。这是符合 POSIX 标准的常见行为(文本文件以换行符结尾)。|
或 >
:默认行为,保留块末尾的换行符(即添加一个 \n
)。|-
或 >-
:剥离 (strip) 块末尾的换行符。解析后的字符串不包含最后一个换行符。|+
或 >+
:保留 (keep) 块末尾的所有换行符。如果块结束时有多行空行,它们都会被保留。-
和 +
的意图是明确的。最安全的做法是明确使用 -
或 +
来表达你的需求。\t
),但强烈建议避免使用制表符,因为不同环境对制表符宽度的解释不同,极易导致缩进错误和解析问题。坚持使用空格(通常是 2 个或 4 个)是最佳实践。|
和 >
块内,大多数字符都是字面量,不需要转义。双引号 "
、单引号 '
、反斜杠 \
等都可以直接书写(除了在折叠块 >
中行尾的 \
有特殊含义)。这使得包含这些字符的文本(如 HTML、SQL)写起来非常方便。例如,在 |
块中写 "This is a quote"
完全没问题。|
和 >
提供了比双引号 "
或单引号 '
更清晰、更适合处理真正多行且需要控制空白的文本的方式。引号标量更适合单行字符串或在单行内需要转义/处理特殊字符的场景。示例:
with_newline: | # 默认,等价于 | 或 >
Line 1
Line 2
# 注意这里下面还有一个空行
stripped: |-
Line 1
Line 2
kept: |+
Line 1
Line 2
# 解析结果:
# with_newline: "Line 1\nLine 2\n\n" (末尾有1个换行符,来自最后那个空行,再加上默认添加的一个?注意:规范是块内容结束行后的空行也会影响,具体实现可能略有差异,通常 `|` 会保留内容中所有行包括末尾空行)
# stripped: "Line 1\nLine 2" (无末尾换行符)
# kept: "Line 1\nLine 2\n\n" (保留了内容末尾的两个换行符)
|
vs >
)|
(字面块) 当:>
(折叠块) 当:\
)。|
和 >
块,以及其他标量样式(普通、单引号、双引号)。-
或 +
修饰符来明确你对尾随换行符的期望 (|
, |-
, |+
, >
, >-
, >+
),避免歧义。YAML 的 |
(字面块) 和 >
(折叠块) 是处理多行字符串的强大工具,它们显著提升了配置文件和复杂数据结构的可读性和可维护性。理解它们之间的核心区别——|
严格保留换行,>
折叠换行为空格(但保留空行和 \
行)——以及缩进、尾随换行控制等共同规则,是有效使用 YAML 的关键。根据你的文本内容是强调精确格式还是自然语言流,明智地选择 |
或 >
,能让你的 YAML 文件既整洁又准确地表达意图。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。