下面是 YAML 多行字符串(block scalar)的常用写法速查。
保留换行:literal(竖线 |)
- 原样保留每一行的换行符与空格,适合代码片段、日志
msg: |
第一行
第二行
第三行解析结果(含结尾换行):” 第一行\n 第二行\n 第三行\n”
折叠换行:folded(大于号 >)
- 单个换行折叠为一个空格;空行会变成段落分隔(保留为一个换行)
- 适合长段落文本
msg: >
这是一段很长的文字,
会被折叠成一行。
空行表示段落分隔。解析结果(含结尾换行): ” 这是一段很长的文字, 会被折叠成一行。\n\n 空行表示段落分隔。\n”
结尾换行控制:chomping 指示符
- 默认(不写):clip,保留一个结尾换行
- -:strip,去掉所有结尾换行
- +:keep,保留所有结尾换行(包括多余空行)
示例:
a: | # clip,保留一个结尾换行
x
b: |- # strip,去掉结尾换行
x
c: |+ # keep,保留所有结尾换行
x
d: > # clip,折叠后保留一个结尾换行
x
e: >- # strip,折叠后无结尾换行
x
f: >+ # keep,折叠后保留所有结尾换行
x
去除公共缩进:缩进指示符(|2 或 >2)
- 在深层结构中,告诉解析器应去掉每行前多少空格
item:
note: |2
for i in range(3):
print(i)解析结果: “for i in range(3):\n print(i)\n”
与引号的多行写法对比
- 单引号 ’…’:可跨行,换行会被原样保留为换行;不支持转义序列
- 双引号 ”…”:可跨行,换行默认为实际换行;支持转义(如 \n、\t、”)
- 若想在双引号内“连接行而不产生换行”,可在行末用反斜杠续行
s1: '第一行
第二行' # 结果含换行
s2: "第一行\n第二行" # 显式转义换行
s3: "第一行\
第二行" # 行续接,无换行 => "第一行第二行"选择建议
- 文本/段落:> 或 >-(常用 >-,避免结尾多余换行)
- 代码/严格排版:| 或 |-(常用 |-)
- 长字符串内需要转义:用双引号
- 嵌套很深时:配合缩进指示符 |2 / >2
常见坑
- block scalar 内的制表符(Tab)不应用作缩进;使用空格
- 缩进必须一致;block 内容至少比键值所在行多缩进一层
- 记住 > 会把单换行折成空格,若不想折叠,请用 |