【问题标题】:How to escape indicator characters (i.e. : or - ) in YAML如何在 YAML 中转义指示符(即 : 或 - )
【发布时间】:2012-07-03 08:07:03
【问题描述】:

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

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

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

是否有明确的方式来逃避 ':' 和 '-' ?或者将整个内容放在单引号中并收工是否可行?

【问题讨论】:

标签: escaping yaml delimiter


【解决方案1】:

行情:

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

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

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

【讨论】:

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

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

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

管道保留换行符,gt-sign 将后面的所有行变成一个长字符串。

【讨论】:

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

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

但如果您的 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/

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

【讨论】:

  • travisCI 的 linter 抱怨冒号异常 - lint.travis-ci.org
  • 对于 Travis CI,单引号内的冒号似乎是可以的。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

    title: My Life: A Memoir
    

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

    【讨论】:

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

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

    "[8.11.32.120:8000]": GoogleMapsKeyforThisDomain
    

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

    【讨论】:

    • 这在我当前的用例中是最有用的。谢谢
    【解决方案7】:

    我来到这里是为了让我的 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 中使用了同样的东西,但直到我需要管道'|'在脚本中 - 它默默地失败了:(
    【解决方案8】:

    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
    

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多