Cómo escapar de caracteres indicadores (es decir: o -) en YAML

241

En un archivo de configuración, tengo una clave a la que deseo asignar una URL. El problema es que YAML interpreta: y - los caracteres como creación de asignaciones o listas, por lo que tiene un problema con la línea

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

(tanto por el colon que sigue a http como por el guión en el medio)

¿Hay alguna forma explícita de escapar de ':' y '-'? ¿O funcionaría simplemente poner todo en comillas simples y llamarlo un día?

danieltahara
fuente

Respuestas:

232

Citas:

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

Para aclarar, quise decir "citar el valor" y originalmente pensé que todo era el valor. Si http://www.example-site.com/es el valor, solo cítelo así:

url: "http://www.example-site.com/"
Ry-
fuente
30
Depende del analizador, aparentemente. Esto no funcionó con Jekyll YAML.
ptomato
1
YAMLDotNet también presenta presupuestos.
Dr1Ku
¿Nada mejor? Porque entonces las citas deben escaparse por sí mismas, lo que no resuelve el problema sino que simplemente lo mueve hacia adelante ...
Augustin Riedinger
2
Bueno, sería mucho mejor tener un documento a prueba de errores, al igual que Markdown, para que los chicos no tecnológicos del equipo puedan editarlo (por ejemplo, archivos de configuración regional en Rails) sin ningún riesgo de romperlo.
Augustin Riedinger
1
@ivan_pozdeev: las comillas van alrededor de toda la cadena. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-
183

Lo que también funciona y es aún mejor para textos largos de varias líneas es colocar el texto sangrado en la siguiente línea, después de una tubería o un signo mayor que:

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

Una tubería conserva nuevas líneas, un signo gt convierte todas las líneas siguientes en una cadena larga.

Micros
fuente
66
... y se agrega una nueva línea al final, que generalmente no es lo que desea.
Equaeghe
51
@equaeghe: puede usar >-o |-para evitar esto.
dtoux
44
Esta es una solución maravillosa. Evita por completo tener que escapar de otros caracteres en tu texto. +++ 90000 puntos
bennlich
¿Es posible tener una lista de líneas múltiples de alguna manera? He intentado - >pero los elementos después del primero se ignoran.
ffghfgh 01 de
3
@ffghfgh - ¡urg! No puedo entender cómo formatear el código correctamente en el comentario y ahora no puedo editar el comentario original. Básicamente, utilicé un elemento de lista con una tubería, como este: - |y luego, en una nueva línea, sangré el texto del elemento de lista para que el primer carácter se alineara con la tubería. Espero que eso ayude, me funcionó en un archivo de configuración regional Rails 4.2.
Spakman
51

De acuerdo con las especificaciones de YAML, ni el :ni el -deberían ser un problema. :es solo un separador de teclas con un espacio después, y -es solo un indicador de matriz al comienzo de una línea con un espacio después.

Pero si su implementación de YAML tiene un problema, potencialmente tiene muchas opciones:

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

Sin embargo, no existe una forma explícita de escape en el " estilo simple ".

Steve Bennett
fuente
1
El pelotón de travisCI se queja de los dos puntos inusuales - lint.travis-ci.org
koppor
Para Travis CI, parece que los dos puntos entre comillas simples están bien.
Malvineous
30

Citas, pero las prefiero solo por el valor:

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

Ponerlos en toda la línea parece que podría causar problemas.

Gringo Suave
fuente
21

Otra forma que funciona con el analizador YAML utilizado en Jekyll:

title: My Life: A Memoir

Los dos puntos no seguidos por espacios no parecen molestar al analizador YAML de Jekyll, por otro lado. Tampoco los guiones.

ptomato
fuente
... son entidades de personajes parte de YAML? ¿Y es lo que Jekyll usa en realidad YAML?
Ry-
Jekyll afirma usarlo: jekyllrb.com/docs/frontmatter No puedo encontrar nada sobre entidades de personajes en la especificación YAML, por lo que sospecho que Jekyll es aberrante, pero creo que esta respuesta sirve bien para las personas que buscan en Google "yaml escape colon" yo ;-)
ptomato
4

Si está usando @ConfigurationPropertiesSpring Boot 2 para inyectar mapas con teclas que contienen dos puntos, entonces necesita un nivel adicional de escape usando corchetes dentro de las comillas porque spring solo permite caracteres alfanuméricos y '-', eliminando el resto. Su nueva clave se vería así:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Vea este tema de github para referencia.

Andy Brown
fuente
Esto es lo más útil en mi caso de uso actual. Gracias
Anand
2

Vine aquí tratando de hacer que mi tarea Azure DevOps Command Line funcione. Lo que funcionó para mí fue usar el carácter pipe ( |). Usar >no funcionó.

Ejemplo:

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"
Hein Andre Grønnestad
fuente
Usé lo mismo .gitlab-ci.yml, pero hasta que necesité tubería '|' en script - falla silenciosamente en él :(
Dalibor