Come sfuggire ai caratteri indicatore (ovvero: o -) in YAML


241

In un file di configurazione, ho una chiave a cui desidero assegnare un URL. Il problema è che YAML interpreta: e - caratteri come creazione di mappature o liste, quindi ha un problema con la linea

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

(sia a causa dei due punti che seguono http e il trattino nel mezzo)

Esiste un modo esplicito per sfuggire a ':' e '-'? O funzionerebbe semplicemente mettere il tutto tra virgolette singole e chiamarlo un giorno?


Risposte:


232

Citazioni:

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

Per chiarire, intendevo "citare il valore" e inizialmente pensavo che l'intero valore fosse il valore. Se http://www.example-site.com/è il valore, citalo in questo modo:

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

30
Dipende dal parser, a quanto pare. Questo non ha funzionato con Jekyll YAML.
ptomato,

1
YAMLDotNet rende anche le virgolette.
Dr1Ku,

Niente di meglio? Perché allora le citazioni devono essere sfuggite a se stesse, il che non risolve il problema ma lo sposta semplicemente in avanti ...
Augustin Riedinger,

2
Bene, sarebbe molto più bello avere un documento a prova di errore, proprio come il markdown, così i ragazzi non tecnici del team possono modificarlo (es. File di localizzazione in Rails) senza il rischio di romperlo!
Augustin Riedinger,

1
@ivan_pozdeev: le virgolette vanno attorno all'intera stringa. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

183

Ciò che funziona anche ed è ancora più bello per i testi lunghi e multilinea, è mettere il tuo testo rientrato nella riga successiva, dopo una pipe o un segno maggiore di:

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

Una pipe preserva le nuove linee, un segno gt trasforma tutte le seguenti righe in una lunga stringa.


6
... e una nuova riga viene aggiunta alla fine, che di solito non è quello che vuoi.
equaeghe

51
@equaeghe: è possibile utilizzare >-o |-per impedirlo.
dtoux,

4
Questa è una soluzione meravigliosa Evita completamente di dover sfuggire ad altri caratteri nel tuo testo. +++ 90000 punti
bennlich,

è possibile avere un elenco di multiline in qualche modo? Ho provato - >ma gli elementi dopo il primo vengono ignorati.
ffghfgh,

3
@ffghfgh - urg! Non riesco a capire come formattare correttamente il codice nel commento e ora non riesco a modificare il commento originale. Fondamentalmente, ho usato una voce di elenco con una pipe, come questa: - |e poi su una nuova riga ho rientrato il testo della voce di elenco in modo che il primo carattere fosse allineato con la pipe. Spero che sia d'aiuto, ha funzionato per me in un file locale di Rails 4.2.
Spakman,

51

Secondo il YAML specifiche, né il :né il -dovrebbe essere un problema. :è solo un separatore di chiavi con uno spazio dopo di esso ed -è solo un indicatore di matrice all'inizio di una riga con uno spazio dopo di esso.

Ma se l'implementazione di YAML ha un problema, potenzialmente hai molte opzioni:

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

Tuttavia, non esiste esplicitamente alcuna forma di fuga in " stile semplice ".


1
La linter di travisCI si lamenta dei due punti inusuali - lint.travis-ci.org
koppor

Per Travis CI, i due punti all'interno delle virgolette singole sono OK.
Malvineous,

30

Citazioni, ma le preferisco solo sul valore:

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

Metterli su tutta la linea sembra che potrebbe causare problemi.


21

Un altro modo che funziona con il parser YAML utilizzato in Jekyll:

title: My Life: A Memoir

D'altra parte, i due punti non seguiti da spazi non sembrano disturbare il parser YAML di Jekyll. Nemmeno i trattini.


... le entità personaggio fanno parte di YAML? E ciò che Jekyll usa in realtà YAML?
Ry-

Jekyll afferma di usarlo: jekyllrb.com/docs/frontmatter Non riesco a trovare nulla sulle entità personaggio nelle specifiche YAML, quindi sospetto che Jekyll sia aberrante, ma penso che questa risposta sia utile per le persone che cercano "yaml escape colon" come Google io ;-)
ptomato

4

Se si utilizza @ConfigurationPropertiesSpring Boot 2 per iniettare mappe con chiavi che contengono due punti, è necessario un ulteriore livello di escape utilizzando parentesi quadre all'interno delle virgolette perché la primavera consente solo caratteri alfanumerici e "-", eliminando il resto. La tua nuova chiave sarebbe simile a questa:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Vedi questo problema github per riferimento.


Questo è il più utile nel mio caso d'uso corrente. Grazie
Anand

2

Sono venuto qui cercando di far funzionare la mia riga di comando DevOps di Azure. La cosa che ha funzionato per me era usare il carattere pipe ( |). L'uso >non ha funzionato.

Esempio:

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"

Ho usato la stessa cosa .gitlab-ci.yml, ma fino a quando non ho avuto bisogno della pipa '|' nello script - non ci riesce in silenzio :(
Dalibor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.