Como escapar de caracteres indicadores (ou seja: ou -) no YAML


241

Em um arquivo de configuração, tenho uma chave à qual desejo atribuir um URL. O problema é que o YAML interpreta: e - caracteres como criando mapeamentos ou listas; portanto, há um problema com a linha

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

(por causa dos dois pontos após http e o hífen no meio)

Existe uma maneira explícita de escapar ':' e '-'? Ou seria apenas colocar a coisa toda entre aspas simples e chamar de dia?


Respostas:


232

Citações:

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

Para esclarecer, eu quis dizer "citar o valor" e originalmente pensei que a coisa toda era o valor. Se http://www.example-site.com/for o valor, apenas cite-o da seguinte maneira:

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

30
Depende do analisador, aparentemente. Isso não funcionou com Jekyll YAML.
Ptomato

1
O YAMLDotNet também renderiza cotações.
Dr1Ku

Nada melhor? Porque então as citações precisam ser escapadas, o que não resolve o problema, mas simplesmente o move para a frente ...
Augustin Riedinger

2
Bem, seria muito mais legal ter um documento à prova de erros, assim como a remarcação, para que o pessoal não técnico da equipe possa editá-lo (por exemplo, arquivos de localização no Rails) sem nenhum risco de quebrá-lo!
Augustin Riedinger

1
@ivan_pozdeev: As aspas percorrem toda a string. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

O que também funciona e é ainda mais agradável para textos longos e com várias linhas, é colocar o texto recuado na próxima linha, após um sinal de barra vertical ou superior a:

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

Um tubo preserva novas linhas, um sinal gt transforma todas as linhas a seguir em uma longa cadeia.


6
... e uma nova linha é adicionada no final, o que geralmente não é o que você deseja.
equaeghe

51
@equaeghe: Você pode usar >-ou |-para evitar isso.
dtoux

4
Esta é uma solução maravilhosa. Evita completamente a necessidade de escapar de outros caracteres no seu texto. +++ 90000 pontos
bennlich

é possível ter uma lista de multilinhas de alguma forma? Eu tentei, - >mas os itens após o primeiro são ignorados.
ffghfgh

3
@ffghfgh - urg! Não consigo descobrir como formatar o código corretamente no comentário e agora não consigo editar o comentário original. Basicamente, usei um item de lista com um pipe, assim: - |e em uma nova linha recuei o texto do item da lista para que o primeiro caractere ficasse alinhado com o pipe. Espero que ajude, funcionou para mim em um arquivo de localidade do Rails 4.2.
Spakman

51

De acordo com as especificações da YAML, nem o :nem o -deve ser um problema. :é apenas um separador de chaves com um espaço a seguir e -é apenas um indicador de matriz no início de uma linha com um espaço a seguir.

Mas se sua implementação de YAML tiver um problema, você poderá ter várias opções:

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

No entanto, não há explicitamente nenhuma forma de escapar possível no " estilo simples ".


1
O linter de travisCI reclama de dois pontos em incomum - lint.travis-ci.org
koppor

Para o Travis CI, parece que dois pontos dentro de aspas simples estão OK.
Malvineous

30

Citações, mas eu prefiro-as apenas no valor:

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

Colocá-los em toda a linha parece que pode causar problemas.


21

Outra maneira que funciona com o analisador YAML usado no Jekyll:

title: My Life: A Memoir

Dois pontos não seguidos por espaços não parecem incomodar o analisador YAML de Jekyll, por outro lado. Nem traços.


… As entidades de caráter fazem parte do YAML? E é o que Jekyll realmente usa YAML?
Ry-

Jekyll afirma usá-lo: jekyllrb.com/docs/frontmatter Não consigo encontrar nada sobre entidades de caracteres na especificação YAML, então suspeito que Jekyll é aberrante, mas acho que essa resposta serve bem para pessoas que pesquisam no Google "yaml escape colon" como eu ;-)
ptomato

4

Se você estiver usando o @ConfigurationPropertiesSpring Boot 2 para injetar mapas com chaves que contêm dois pontos, precisará de um nível adicional de escape usando colchetes dentro das aspas, porque o spring apenas permite caracteres alfanuméricos e '-', eliminando o restante. Sua nova chave ficaria assim:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Vejo este problema do github para referência.


Isso é o mais útil no meu caso de uso atual. Obrigado
anand

2

Eu vim aqui tentando fazer minha tarefa de Linha de Comando do Azure DevOps funcionar. O que funcionou para mim foi usar o |caractere pipe ( ). Usar >não funcionou.

Exemplo:

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"

Eu usei a mesma coisa .gitlab-ci.yml, mas até precisar de cachimbo '|' no script - ele falha silenciosamente :(
Dalibor 25/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.