下面是 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 内容至少比键值所在行多缩进一层
  • 记住 > 会把单换行折成空格,若不想折叠,请用 |