Как экранировать символы индикатора (т.е.: или -) в YAML


241

В файле конфигурации у меня есть ключ, которому я хочу назначить URL. Проблема в том, что YAML интерпретирует: и - символы как создающие отображения или списки, поэтому у него есть проблема со строкой

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

(из-за двоеточия после http и дефиса в середине)

Есть ли явный способ избежать ':' и '-'? Или это будет работать, если поместить все это в одинарные кавычки и назвать это днем?


Ответы:


232

Цитаты:

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

Чтобы уточнить, я имел в виду «процитировать стоимость» и изначально думал, что все это была ценность. Если http://www.example-site.com/это значение, просто процитируйте его так:

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

30
Это зависит от парсера, по-видимому. Это не сработало с Jekyll YAML.
ptomato

1
YAMLDotNet также предоставляет котировки.
Dr1Ku

Ничего лучше? Потому что тогда нужно самим избегать кавычек, что не решает проблему, а просто продвигает ее вперед ...
Августин Ридингер

2
Что ж, было бы намного круче иметь защищенный от ошибок документ, такой же, как уценка, так что нетехнические ребята из команды могут редактировать его (например, файлы локалей в Rails) без риска его взлома!
Августин Ридингер

1
@ivan_pozdeev: кавычки идут вокруг всей строки. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

183

Что также работает и даже лучше для длинных многострочных текстов, так это помещает текст с отступом на следующую строку, после пробела или знака «больше»:

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

Канал сохраняет символы новой строки, а знак gt превращает все следующие строки в одну длинную строку.


6
... и в конце добавляется перевод строки, что обычно не то, что вы хотите.
Equaeghe

51
@equaeghe: Вы можете использовать >-или |-для того, чтобы предотвратить это.
dtoux

4
Это прекрасное решение. Полностью исключает необходимость экранирования других символов в вашем тексте. +++ 90000 баллов
Беннлич

можно ли как-нибудь иметь список мультилиней? Я пробовал, - >но элементы после первого игнорируются.
ffghfgh

3
@ffghfgh - Ург! Я не могу понять, как правильно отформатировать код в комментарии, и теперь я не могу редактировать исходный комментарий. По сути, я использовал элемент списка с каналом, например, так: - |затем в новой строке я отступил в текст элемента списка, чтобы первый символ выровнялся с каналом. Я надеюсь, что это помогает, у меня это работает в файле локали Rails 4.2.
Спакман

51

Согласно спецификации YAML, ни то, :ни другое не -должно быть проблемой. :является только ключевым разделителем с пробелом после него и -является только индикатором массива в начале строки с пробелом после него.

Но если у вашей реализации YAML есть проблема, у вас может быть много вариантов:

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

Однако в « простом стиле » явно не существует возможности избежать этого .


1
Линтер travisCI жалуется на необычные двоеточия - lint.travis-ci.org
koppor

Для Travis CI кажется, что двоеточия внутри одинарных кавычек в порядке.
Malvineous

30

Цитаты, но я предпочитаю их только по значению:

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

Размещение их по всей линии выглядит так, как будто это может вызвать проблемы.


21

Еще один способ работы с синтаксическим анализатором YAML, используемый в Jekyll:

title: My Life: A Memoir

С другой стороны, двоеточия, за которыми не следует пробел, похоже, не беспокоят анализатор YAML Джекилла. Не делайте тире.


… Являются ли сущности персонажей частью YAML? И что Джекилл использует на самом деле YAML?
Ry-

Джекилл утверждает, что использует это: jekyllrb.com/docs/frontmatter Я не могу найти ничего о символьных сущностях в спецификации YAML, поэтому я подозреваю, что Джекилл аберрант, но я думаю, что этот ответ хорошо подходит для людей, прибегающих к помощи "yaml escape colon", таких как я ;-)
ptomato

4

Если вы используете @ConfigurationPropertiesSpring Boot 2 для ввода карт с ключами, содержащими двоеточия, вам нужен дополнительный уровень экранирования с использованием квадратных скобок внутри кавычек, потому что в Spring допускаются только буквенно-цифровые символы и символы «-», удаляя остальные. Ваш новый ключ будет выглядеть так:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Смотрите этот вопрос GitHub для справки.


Это наиболее полезно в моем текущем случае использования. Спасибо
Ананд

2

Я пришел сюда, пытаясь заставить мою задачу командной строки Azure DevOps работать. То, что работало для меня, это использование |символа pipe ( ). Использование >не работает.

Пример:

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"

Я использовал то же самое .gitlab-ci.yml, но пока мне не понадобилась труба '|' в сценарии - он молча терпит неудачу :(
Далибор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.