Comment échapper les caractères indicateurs (ie: ou -) dans YAML


241

Dans un fichier de configuration, j'ai une clé à laquelle je souhaite attribuer une URL. Le problème est que YAML interprète les caractères: et - comme créant des mappages ou des listes, il a donc un problème avec la ligne

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

(à la fois à cause des deux points suivant http et du tiret au milieu)

Existe-t-il un moyen explicite d'échapper à «:» et «-»? Ou cela fonctionnerait-il de simplement mettre le tout entre guillemets simples et de l'appeler un jour?


Réponses:


232

Citations:

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

Pour clarifier, je voulais dire «citer la valeur» et pensais à l'origine que la chose entière était la valeur. Si http://www.example-site.com/est la valeur, citez-la comme suit:

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

30
Cela dépend de l'analyseur, apparemment. Cela n'a pas fonctionné avec Jekyll YAML.
ptomato

1
YAMLDotNet rend également des devis.
Dr1Ku

Rien de mieux? Parce qu'alors, les citations doivent être échappées elles-mêmes, ce qui ne résout pas le problème mais le fait simplement avancer ...
Augustin Riedinger

2
Eh bien, ce serait beaucoup plus cool d'avoir un document à l'épreuve des erreurs, tout comme le démarquage, afin que les gars non techniques de l'équipe puissent le modifier (par exemple, les fichiers locaux dans Rails) sans aucun risque de le casser!
Augustin Riedinger du

1
@ivan_pozdeev: Les guillemets font le tour de la chaîne entière. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

183

Ce qui fonctionne aussi et qui est encore plus agréable pour les textes longs et multilignes, c'est de mettre votre texte en retrait sur la ligne suivante, après un tuyau ou un signe supérieur à:

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

Un tube conserve les sauts de ligne, un signe gt transforme toutes les lignes suivantes en une longue chaîne.


6
... et une nouvelle ligne est ajoutée à la fin, ce qui n'est généralement pas ce que vous voulez.
equaeghe

51
@equaeghe: Vous pouvez utiliser >-ou |-pour éviter cela.
dtoux

4
C'est une merveilleuse solution. Évite complètement d'avoir à échapper à d'autres caractères de votre texte. +++ 90000 points
bennlich

est-il possible d'avoir une liste de multilignes en quelque sorte? J'ai essayé - >mais les éléments après le premier sont ignorés.
ffghfgh

3
@ffghfgh - urg! Je ne peux pas comprendre comment formater correctement le code dans le commentaire et maintenant je ne peux pas modifier le commentaire d'origine. Fondamentalement, j'ai utilisé un élément de liste avec un tuyau, comme ceci: - |puis sur une nouvelle ligne, j'ai indenté le texte de l'élément de liste de sorte que le premier caractère soit aligné avec le tuyau. J'espère que cela aide, cela a fonctionné pour moi dans un fichier de paramètres régionaux Rails 4.2.
Spakman

51

Selon la spécification YAML, ni le :ni le -ne devraient être un problème. :n'est qu'un séparateur de clés avec un espace après, et -n'est qu'un indicateur de tableau au début d'une ligne avec un espace après.

Mais si votre implémentation YAML a un problème, vous avez potentiellement beaucoup d'options:

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

Il n'y a cependant explicitement aucune forme d'échappatoire possible en " style simple ".


1
Le linter de travisCI se plaint de deux points en insolite - lint.travis-ci.org
koppor

Pour Travis CI, il semble que les deux-points entre guillemets simples soient OK.
Malvineous

30

Citations, mais je les préfère sur la juste valeur:

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

Les placer sur toute la ligne semble provoquer des problèmes.


21

Une autre méthode qui fonctionne avec l'analyseur YAML utilisé dans Jekyll:

title: My Life: A Memoir

Les deux points non suivis d'espaces ne semblent pas déranger l'analyseur YAML de Jekyll, d'autre part. Les tirets non plus.


… Les entités de caractère font-elles partie de YAML? Et qu'est-ce que Jekyll utilise réellement YAML?
Ry-

Jekyll prétend l'utiliser: jekyllrb.com/docs/frontmatter Je ne trouve rien sur les entités de personnage dans la spécification YAML, donc je soupçonne que Jekyll est aberrant, mais je pense que cette réponse sert bien aux gens qui recherchent sur Google "yaml escape colon" comme moi ;-)
ptomato

4

Si vous utilisez @ConfigurationPropertiesavec Spring Boot 2 pour injecter des cartes avec des clés contenant des deux-points, vous avez besoin d'un niveau supplémentaire d'échappement en utilisant des crochets à l'intérieur des guillemets car Spring n'autorise que les caractères alphanumériques et `` - '', supprimant le reste. Votre nouvelle clé ressemblerait à ceci:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Consultez ce numéro de github pour référence.


C'est le plus utile dans mon cas d'utilisation actuel. Merci
anand

2

Je suis venu ici pour essayer de faire fonctionner ma tâche de ligne de commande Azure DevOps. La chose qui a fonctionné pour moi était d'utiliser le caractère pipe ( |). L'utilisation >n'a pas fonctionné.

Exemple:

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"

J'ai utilisé la même chose .gitlab-ci.yml, mais jusqu'à ce que j'aie besoin d'une pipe '|' dans le script - il échoue silencieusement dessus :(
Dalibor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.