So entkommen Sie Indikatorzeichen (dh: oder -) in YAML


241

In einer Konfigurationsdatei habe ich einen Schlüssel, dem ich eine URL zuweisen möchte. Das Problem ist, dass YAML: und - Zeichen so interpretiert, dass sie entweder Zuordnungen oder Listen erstellen, sodass ein Problem mit der Zeile vorliegt

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

(sowohl wegen des Doppelpunkts nach http als auch wegen des Bindestrichs in der Mitte)

Gibt es einen expliziten Weg, um ':' und '-' zu entkommen? Oder würde es funktionieren, das Ganze einfach in einfache Anführungszeichen zu setzen und es einen Tag zu nennen?


Antworten:


232

Zitate:

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

Zur Verdeutlichung meinte ich „zitiere den Wert“ und dachte ursprünglich, das Ganze sei der Wert. Wenn http://www.example-site.com/der Wert ist, zitieren Sie ihn einfach so:

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

30
Es kommt anscheinend auf den Parser an. Dies funktionierte nicht mit Jekyll YAML.
Ptomato

1
YAMLDotNet rendert auch Anführungszeichen.
Dr1Ku

Nichts besser? Denn dann müssen Zitate selbst entkommen, was das Problem nicht löst, sondern einfach voranbringt ...
Augustin Riedinger

2
Nun, es wäre viel cooler, ein fehlersicheres Dokument zu haben, genau wie Markdown, damit die Nicht-Techniker des Teams es bearbeiten können (z. B. Gebietsschemadateien in Rails), ohne dass die Gefahr besteht, dass es beschädigt wird!
Augustin Riedinger

1
@ivan_pozdeev: Die Anführungszeichen gehen um die gesamte Zeichenfolge. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

Was auch für lange, mehrzeilige Texte funktioniert und noch schöner ist, ist, Ihren Text nach einer Pipe oder einem Größer-als-Zeichen in die nächste Zeile einzurücken:

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

Eine Pipe bewahrt Zeilenumbrüche, ein GT-Zeichen verwandelt alle folgenden Zeilen in eine lange Zeichenfolge.


6
... und am Ende wird eine neue Zeile hinzugefügt, was normalerweise nicht das ist, was Sie wollen.
Equaeghe

51
@equaeghe: Sie können >-oder |-verwenden, um dies zu verhindern.
dtoux

4
Dies ist eine wunderbare Lösung. Vermeidet vollständig, dass Sie anderen Zeichen in Ihrem Text entkommen müssen. +++ 90000 Punkte
Bennlich

Ist es möglich, irgendwie eine Liste von Multilines zu haben? Ich habe es versucht, - >aber die Elemente nach dem ersten werden ignoriert.
ffghfgh

3
@ffghfgh - dringend! Ich kann nicht herausfinden, wie der Code im Kommentar richtig formatiert wird, und jetzt kann ich den ursprünglichen Kommentar nicht mehr bearbeiten. Grundsätzlich habe ich ein Listenelement mit einer Pipe wie - |folgt verwendet : In einer neuen Zeile habe ich den Text des Listenelements so eingerückt, dass das erste Zeichen mit der Pipe übereinstimmt. Ich hoffe das hilft, es hat bei mir in einer Rails 4.2 Locale Datei funktioniert.
Spakman

51

Gemäß der YAML-Spezifikation sollten weder das :noch das -ein Problem sein. :ist nur ein Schlüsseltrennzeichen mit einem Leerzeichen danach und -nur ein Array-Indikator am Anfang einer Zeile mit einem Leerzeichen danach.

Wenn Ihre YAML-Implementierung jedoch ein Problem damit hat, haben Sie möglicherweise viele Optionen:

- 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/

Es ist jedoch ausdrücklich keine Form des Entkommens im " einfachen Stil " möglich .


1
Der Linter von travisCI beschwert sich über Doppelpunkte in ungewöhnlichen - lint.travis-ci.org
koppor

Für Travis CI scheinen Doppelpunkte in einfachen Anführungszeichen in Ordnung zu sein.
Malvineous

30

Zitate, aber ich bevorzuge sie nur auf den Wert:

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

Wenn Sie sie über die gesamte Linie verteilen, kann dies zu Problemen führen.


21

Eine andere Möglichkeit, die mit dem in Jekyll verwendeten YAML-Parser funktioniert:

title: My Life: A Memoir

Doppelpunkte, denen keine Leerzeichen folgen, scheinen Jekylls YAML-Parser dagegen nicht zu stören. Striche auch nicht.


… Sind Charaktereinheiten Teil von YAML? Und benutzt Jekyll tatsächlich YAML?
Ry-

Jekyll behauptet, es zu verwenden: jekyllrb.com/docs/frontmatter Ich kann nichts über Charakterentitäten in der YAML-Spezifikation finden, daher vermute ich, dass Jekyll abweichend ist, aber ich denke, diese Antwort eignet sich gut für Leute, die "yaml Fluchtkolon" wie googeln ich ;-)
ptomato

4

Wenn Sie @ConfigurationPropertiesmit Spring Boot 2 Karten mit Schlüsseln einfügen, die Doppelpunkte enthalten, benötigen Sie eine zusätzliche Escape-Ebene mit eckigen Klammern in den Anführungszeichen, da Spring nur alphanumerische Zeichen und '-' Zeichen zulässt und den Rest entfernt. Ihr neuer Schlüssel würde folgendermaßen aussehen:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Weitere Informationen finden Sie in dieser Github-Ausgabe.


Dies ist in meinem aktuellen Anwendungsfall am hilfreichsten. Danke
4.

2

Ich bin hierher gekommen, um meine Azure DevOps-Befehlszeilenaufgabe zum Laufen zu bringen. Bei mir hat es funktioniert, dass ich das |Zeichen pipe ( ) verwendet habe. Die Verwendung >hat nicht funktioniert.

Beispiel:

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"

Ich habe das gleiche verwendet .gitlab-ci.yml, aber bis ich Pipe '|' brauchte im Skript - es schlägt lautlos fehl :(
Dalibor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.