YAMLでインジケータ文字(:または-)をエスケープする方法


241

設定ファイルに、URLを割り当てたいキーがあります。問題は、YAMLが:と-の文字をマッピングまたはリストの作成として解釈するため、行に問題があります

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

(httpに続くコロンと中央のハイフンのため)

「:」と「-」をエスケープする明示的な方法はありますか?それとも、全体を一重引用符で囲み、それを1日と呼ぶだけで十分でしょうか?


回答:


232

引用:

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

明確にするために、私は「価値を引用する」ことを意味し、当初はすべてが価値であると考えていました。http://www.example-site.com/値である場合は、次のように引用します。

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

30
どうやら、それはパーサーに依存します。これはJekyll YAMLでは機能しませんでした。
ptomato 2013

1
YAMLDotNetは引用符もレンダリングします。
Dr1Ku 2013年

より良いものはない?その後、引用符は、問題が解決しない、自分自身をエスケープする必要がなく、単に...前方に移動するため
オーギュRiedinger

2
まあ、マークダウンと同じようにエラーのないドキュメントを用意する方がはるかにクールです。そのため、チームの非技術者がドキュメント(Railsのロケールファイルなど)を壊すリスクなしに編集できます。
Augustin Riedinger、2015年

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記号は後続のすべての行を1つの長い文字列に変えます。


6
...そして最後に改行が追加されますが、これは通常は必要ありません。
equaeghe

51
@equaeghe:>-または|-これを防ぐために使用できます。
dtoux 2015年

4
これは素晴らしい解決策です。テキスト内の他の文字をエスケープする必要を完全に回避します。+++ 90000ポイント
bennlich 2015年

どういうわけかマルチラインのリストを持つことは可能ですか?私は試しました- >が、最初の項目以降は無視されます。
ffghfgh 2015

3
@ffghfgh-urg!コメントでコードを適切にフォーマットする方法がわからないので、元のコメントを編集できません。基本的に、次のようにパイプを含むリストアイテムを使用しました。- |次に、新しい行でリストアイテムのテキストをインデントして、最初の文字がパイプと並ぶようにしました。Rails 4.2ロケールファイルでうまく機能したことを願っています。
Spakman、

51

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/

ただし、「プレーンスタイル」では、明示的にエスケープすることはできません。


1
travisCIのリンターが異常なコロンについて不平を言う-lint.travis-ci.org
koppor

Travis CIの場合、単一引用符内のコロンは問題ないようです。
Malvineous

30

引用しますが、私はちょうど値でそれらを好みます:

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

ライン全体に配置すると、問題が発生する可能性があります。


21

Jekyllで使用されるYAMLパーサーで機能する別の方法:

title: My Life: A Memoir

一方、コロンの後にスペースがない場合は、JekyllのYAMLパーサーを邪魔しないようです。ダッシュもしない。


…文字エンティティはYAMLの一部ですか?そして、ジキルは実際にYAMLを使用していますか?
Ry-

Jekyllはそれを使用すると主張しています:jekyllrb.com/docs/frontmatter YAML仕様では文字エンティティについて何も見つからないので、Jekyllは異常だと思いますが、この答えは、「yamlエスケープコロン」のようにグーグルする人々に役立つと思います私;-)
ptomato 2013

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.