ChatGPT解决这个技术问题 Extra ChatGPT

如何在 YAML 中转义指示符(冒号和连字符)

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

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

(都是因为 HTTP 后面的冒号和中间的连字符)

是否有明确的方法来转义 :-?或者将整个内容放在单引号中并收工是否可行?


S
Stephen Ostermiller

引号:

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

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

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

显然,这取决于解析器。这不适用于 Jekyll YAML。
YAMLDotNet 也呈现引号。
没有什么比......好?因为 then 引号需要自己转义,这并不能解决问题,而只是将其向前移动...
好吧,拥有一个防错文档会更酷,就像 Markdown 一样,所以团队中的非技术人员可以编辑它(例如 Rails 中的语言环境文件),而不会有任何破坏它的风险!
@ivan_pozdeev:引号围绕整个字符串。 - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
O
Oliver Salzburg

对于长的多行文本来说,还有什么更有效,甚至更好的是,将您的文本缩进到下一行,在竖线或大于号之后:

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

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


...并在末尾添加换行符,这通常不是您想要的。
@equaeghe:您可以使用 >-|- 来防止这种情况。
这是一个绝妙的解决方案。完全避免必须转义文本中的其他字符。 +++90000 点
是否有可能以某种方式拥有多行列表?我试过 - > 但第一个之后的项目被忽略了。
@ffghfgh - 急!我无法弄清楚如何在评论中正确格式化代码,现在我无法编辑原始评论。基本上,我使用了一个带有管道的列表项,如下所示:- |,然后在新行上我缩进了列表项文本,以便第一个字符与管道对齐。我希望这会有所帮助,它在 Rails 4.2 语言环境文件中对我有用。
S
Stephen Ostermiller

根据 YAML 规范,:- 都不是问题。 : 只是一个键分隔符,后面有一个空格,而 - 只是一个数组指示符,位于行首,后面有一个空格。

但是如果你的 YAML 实现有问题,你可能有很多选择:

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

然而,在“plain style”中没有明确的转义形式。


travisCI 的 linter 抱怨冒号异常 - lint.travis-ci.org
对于 Travis CI,单引号内的冒号似乎是可以的。
在 yaml 文件中粘贴 json 时要小心。在 : 之后天真地添加空格是很常见的。
S
Stephen Ostermiller

引号,但我更喜欢它们的价值:

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

将它们放在整条线上看起来可能会导致问题。


p
ptomato

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

title: My Life: A Memoir

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


…字符实体是 YAML 的一部分吗? Jekyll 实际使用的是 YAML 吗?
Jekyll 声称使用它:jekyllrb.com/docs/frontmatter我在 YAML 规范中找不到任何关于字符实体的信息,所以我怀疑 Jekyll 是异常的,但我认为这个答案非常适合像我一样使用谷歌搜索“yaml 转义冒号”的人 ;-)
A
Andy Brown

如果您在 Spring Boot 2 中使用 @ConfigurationProperties 来注入包含冒号的键的映射,那么您需要在引号内使用方括号进行额外级别的转义,因为 spring 只允许字母数字和“-”字符,去除其余字符。您的新密钥将如下所示:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

请参阅 this github 问题以供参考。


这在我当前的用例中是最有帮助的。谢谢
H
Hein Andre Grønnestad

我来这里是为了让我的 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 中使用了相同的东西,但直到我需要管道'|'在脚本中-它默默地失败了:(
这似乎与问题无关。问题是关于 YAML 中的冒号和破折号。这看起来像是一个完全不同的问题的解决方案。
@StephenOstermiller 我不同意这与一个完全不同的问题有关。答案添加了有关特定用例的附加信息,并基于它帮助了某些人的支持。当我在 Google 上搜索某些内容并在结果中显示相关问题时,我发现分享我的解决方案非常有用,这样当其他人搜索相同的内容时,他们也可以找到解决方案。
A
Alex Cohn

GitHub 操作抱怨

curl -L -H "Authorization: token ${{ secrets.TOKEN }}"  https://example.com/try.txt

但是冒号后没有空格也没关系,比如

curl -L -H "Authorization:token ${{ secrets.TOKEN }}"  https://example.com/try.txt

使用多行命令,以 > 或 | 开头然后在下一行写下你的命令。
这似乎与问题无关。问题是关于 YAML 中的冒号。这看起来像是一个完全不同的问题的解决方案。