如何在YAML中转义指示符(即:或-)


241

在配置文件中,我有一个希望为其分配URL的密钥。问题在于YAML将:和-字符解释为创建映射或列表的原因,因此该行存在问题

url: http://www.example-site.com/

(都是由于冒号位于http后面,中间是连字符)

有没有一种明确的方法可以逃脱':'和'-'吗?还是将整个事情都用单引号引起来就行了吗?


Answers:


232

语录:

"url: http://www.example-site.com/"

为了澄清起见,我的意思是“引用价值”,最初认为整个事情就是价值。如果http://www.example-site.com/是值,请像这样引用它:

url: "http://www.example-site.com/"

30
显然,这取决于解析器。这与Jekyll YAML不兼容。
ptomato

1
YAMLDotNet也提供引号。
Dr1Ku

没有什么比......好?因为那样的话,引号需要自己逃脱,这不能解决问题,而只是将其向前推进……
Augustin Riedinger 2015年

2
好吧,像Markdown一样,拥有一个防错文档会更酷,因此团队的非技术人员可以对其进行编辑(例如,Rails中的locale文件)而不会破坏它!
奥古斯丁·里丁格

1
@ivan_pozdeev:引号包含在整个字符串中。- 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

对于长的多行文本,也可以使用,甚至更好的方法是,在竖线或大于号之后将您的文本缩进到下一行:

text: >
    Op dit plein stond het hoofdkantoor van de NIROM: Nederlands Indische 
    Radio Omroep

管道保留换行符,一个gt符号将以下所有行变成一个长字符串。


6
...并在末尾添加换行符,这通常不是您想要的。
equaeghe 2015年

51
@equaeghe:您可以使用>-|-以防止这种情况。
dtoux 2015年

4
这是一个很棒的解决方案。完全避免必须在文本中转义其他字符。+++ 90000点
bennlich

是否可以以某种方式列出多行?我已经尝试过,- >但是第一个之后的项目将被忽略。
ffghfgh

3
@ffghfgh-催!我不知道如何在注释中正确设置代码格式,现在我无法编辑原始注释。基本上,我使用带有管道的列表项,如下所示:- |然后在新行上缩进列表项文本,以使第一个字符与管道对齐。希望对您有所帮助,它在Rails 4.2语言环境文件中对我有用。
Spakman '16

51

根据YAML规范,the :和the -都不应该成为问题。:只是一个键分隔符,后跟一个空格,并且-只是一个数组指示符,位于行首,后面有一个空格。

但是,如果您的YAML实施存在问题,则可能有很多选择:

- url: 'http://www.example-site.com/'
- url: "http://www.example-site.com/"
- url:
    http://www.example-site.com/
- url: >-
    http://www.example-site.com/
- url: |-
    http://www.example-site.com/

但是,显然没有以“ 纯样式 ” 进行转义的形式。


1
travisCI的短子抱怨不寻常的结肠-lint.travis-ci.org
koppor

对于Travis CI,单引号内的冒号似乎可以。
Malvineous


21

与Jekyll中使用的YAML解析器配合使用的另一种方法是:

title: My Life: A Memoir

另一方面,冒号后面没有空格似乎不会打扰Jekyll的YAML解析器。破折号也没有。


……角色实体是YAML的一部分吗?Jekyll实际使用的是YAML吗?
Ry-

Jekyll声称要使用它:jekyllrb.com/docs/frontmatter我在YAML规范中找不到有关字符实体的任何信息,因此我怀疑Jekyll是异常的,但我认为此答案非常适用于谷歌搜索“ yaml冒号冒号”的人我;-)
ptomato

4

如果您正在使用@ConfigurationPropertiesSpring Boot 2来注入带有冒号的键的映射,那么您需要在引号内使用方括号来进行额外的转义,因为spring仅允许使用字母数字和'-'字符,其余字符被去除。您的新密钥如下所示:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

请参阅 github问题以供参考。


在我当前的用例中,这是最有用的。谢谢
anand

2

我来到这里试图使我的Azure DevOps命令行任务正常运行。对我有用的是使用竖线(|)字符。使用>无效。

例:

steps:
- task: CmdLine@2
  inputs:
    script: |
      echo "Selecting Mono version..."
      /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1"
      echo "Selecting Xcode version..."
      /bin/bash -c "echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'/Applications/Xcode_10.2.1.app;sudo xcode-select --switch /Applications/Xcode_10.2.1.app/Contents/Developer"

我在中使用了相同的东西.gitlab-ci.yml,但是直到需要管道'|' 在脚本中-它在它上无声地失败了:(
Dalibor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.