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

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

问题

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

换句话说,我有:

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

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

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

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

答案

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

TL;DR

符号 >

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

key: >
  Your long
  string here.
YAML

符号 |

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

key: |
  ### Heading
  * Bullet
  * Points
YAML

>-|-

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

符号 ""

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

key: "Antidisestab\
 lishmentarianism.\n\nGet on it."
YAML

YAML 太诡异了🤬🤬🤬

块标量样式(>|)

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

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

Key: >
  this is my very very very
  long string
YAML

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

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

👍️ 建议:

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

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

Key: |
  this is my very very very 
  long string
YAML

结果是: 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(没有转义,没有 #:组合,第一个字符不能是 "' 或许多其他标点字符):

Key: this is my very very very 
  long string
YAML

👍️ 建议:

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

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

结果是:

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

👍️ 建议:

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

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

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

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

👍️ 建议:

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

带 缩进指示器的块样式

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

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

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

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

📚️ Reference:

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

- >
    my long
      string
                    
    many spaces above
- my long
      string
                    
    many spaces above
YAML

结果是: ["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 在同一行上开始 | 🚫 | 🚫 | ✅ | ✅ | ✅ | 🚫 | 🚫 | 🚫 | 🚫 |

示例🥴🥴🥴

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

- >
  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."
]
相关文章
|
11天前
|
JSON Linux 开发工具
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
YAML中多行字符串的配置方法总结
YAML中多行字符串的配置方法总结
2188 0
|
11天前
|
存储 IDE 测试技术
玩转数据处理利器:学会使用 YAML 文件轻松处理数据
玩转数据处理利器:学会使用 YAML 文件轻松处理数据
148 0
|
7月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
【云原生】使用k8s创建nginx服务—通过yaml文件svc类型暴露
283 0
|
7月前
|
Web App开发 资源调度 JavaScript
SAP Fiori Elements 应用里的 ui5.yaml 文件详解试读版
SAP Fiori Elements 应用里的 ui5.yaml 文件详解试读版
182 0
|
7月前
|
Kubernetes 应用服务中间件 nginx
kubernetes集群命令行工具kubectl介绍&yaml文件介绍-20230208
kubernetes集群命令行工具kubectl介绍&yaml文件介绍-20230208
165 0
|
11天前
|
机器学习/深度学习 数据可视化 计算机视觉
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
326 1
|
11天前
|
XML 存储 Java
【OpenCV】—输入输出XML和YAML文件
【OpenCV】—输入输出XML和YAML文件
140 1
|
11天前
|
Shell Go
go 编辑yaml 文件
在Go语言中编辑YAML文件通常涉及以下步骤: 1. 读取YAML文件内容到字符串。 2. 使用YAML解析库(如`gopkg.in/yaml.v2`)将字符串解析为Go数据结构(如`map[string]interface{}`或自定义的结构体)。 3. 修改数据结构中的值以更新YAML内容。 4. 将修改后的数据结构编码回YAML格式的字符串。 5. 将字符串写回到YAML文件。 以下是一个简单的例子,展示了如何使用`gopkg.in/yaml.v2`库来编辑YAML文件: 首先,确保你已经安装了`gopkg.in/yaml.v2`包: ```bash go get gopkg.i
109 0
|
7月前
|
Kubernetes NoSQL 关系型数据库
通过编写k8s的资源清单yaml文件部署gitlab服务
通过编写k8s的资源清单yaml文件部署gitlab服务