「译文」如何在 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."
]
相关文章
|
6月前
|
JSON Linux 开发工具
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
「译文」给讨厌 YAML 的人的 10 个写 YAML 的建议
YAML中多行字符串的配置方法总结
YAML中多行字符串的配置方法总结
2446 0
|
2月前
|
JSON Kubernetes API
深入理解Kubernetes配置:编写高效的YAML文件
深入理解Kubernetes配置:编写高效的YAML文件
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
29天前
|
Kubernetes 应用服务中间件 nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
k8s学习--YAML资源清单文件托管服务nginx
|
29天前
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
ingress相关yaml文件报错且相关资源一切正常解决方法
|
29天前
|
Kubernetes Docker Perl
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)
|
4月前
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之s.yaml文件中如何使用外部环境变量
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
存储 缓存 运维
函数计算产品使用问题之如何将外部环境变量放到s.yaml文件中使用
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
3月前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
82 0