В YAML как разбить строку на несколько строк?

В YAML у меня есть очень длинная строка. Я хочу сохранить это в 80-колоночном (или около того) виде моего редактора, поэтому я хотел бы разбить строку. Какой синтаксис для этого?

Другими словами, у меня есть это:

Key: 'this is my very very very very very very long string'

и я хотел бы иметь это (или что-то на этот счет):

Key: 'this is my very very very ' +
     'long string'

Я хотел бы использовать кавычки, как указано выше, поэтому мне не нужно ничего экранировать внутри строки.

Ответы на вопрос(8)

Сохранятьпереводы строк использование|, например:

|
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with newlines preserved.

переводится как «Это очень длинное предложение»\ п который охватывает несколько строк в YAML‌\ п но который будет представлен как строка‌\ п с переводом строки.\ п"

 Alain140514 янв. 2014 г., 17:52
Не проблема в том, что если я напишу: - field1: | один два - field1: | три для 'я получаю: один \ ntwo \ n и три \ nfor? Я бы аспект 2 \ n после 2, чтобы не быть там ...
 geek-merlin23 нояб. 2017 г., 18:07
Yay, вот волшебник:yaml-multiline.info
 cboettig24 окт. 2013 г., 00:09
Кажется, это нормально работает с двумя строками, а не с тремя?
 Diego D23 сент. 2016 г., 12:45
@Rubytastic, чтобы эти строки разрывов также были на вашей HTML-странице, сгенерированной Rails, вам нужно принять некоторые меры предосторожности. Я уже ответил здесь:stackoverflow.com/questions/10982706/...
 cboettig24 окт. 2013 г., 21:48
Спасибо, там работает нормально, как вы говорите. По какой-то причине в заголовках yaml Пандока мне нужно повторить| в каждой строке по причинам, которые не очевидны для меня:groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
 Ali Shakiba24 окт. 2013 г., 21:12
@cboettig Попробуйте здесь:nodeca.github.io/js-yaml
 Karl Richter30 апр. 2016 г., 16:27
При использовании многострочногоcat с разделителем это приводит к тому, что ведущие пробелы (необходимые для YAML) добавляются к выводу.
 Jonathan12 сент. 2017 г., 11:01
echo -e $CONFIG | awk '{$1=$1};1' удалит завершающие и ведущие пробелы
 Jonathan12 сент. 2017 г., 10:49
@KarlRichter Я сталкиваюсь с этим, с первой строкой все в порядке, однако все последующие строки имеют завершающий пробел, который заставляет эластичный поиск отклонить всю конфигурацию
 Carlos Calla10 сент. 2014 г., 23:00
не ответ на вопрос, но действительно полезно
 Anthon09 нояб. 2018 г., 17:38
@AliShakiba Вы пропустили последний перевод строки. Кроме того, нет необходимости делать отступы для скалярных линий, если они находятся в корне документа.
 Rubytastic13 нояб. 2013 г., 17:03
Этот пример НЕ конвертируется в новые строки в rails 4!

зовать многострочные переводы в Javascript, сразу после перевода добавляется возврат каретки. Так что даже следующий код:

var javascriptVariable = "{{- 'key'|trans -}}";

Который имеет следующий перевод YML:

key: >
    This is a
    multi line 
    translation.

Все равно приведет к следующему коду в HTML:

var javascriptVariable = "This is a multi line translation.
";

Таким образом, знак минус в Twig не решает эту проблему. Решение состоит в том, чтобы добавить этот знак минус после знака «больше, чем» в yml:

key: >-
    This is a
    multi line 
    translation.

Будет ли правильный результат, многострочный перевод в одну строку в Twig:

var javascriptVariable = "This is a multi line translation.";
 dreftymac20 янв. 2016 г., 05:45
Это похоже на ошибку. У вас была возможность подать отчет об ошибке?

1. Блок обозначений: Новые строки становятся пробелами, а дополнительные - после удаления блока.

# Note: It has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

Эквивалент JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2. Буквальный блок Скаляр: Буквальный блок Скаляр| будет включать переводы строки и любые пробелы. но удаляет лишнее

новые строки после блока.


# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  


...

Эквивалент JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. + индикатор с литеральным скалярным блоком: сохранить дополнительные символы новой строки после блока


# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.


...

Эквивалент JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. - индикатор с литеральным скалярным блоком:  означает, что перевод строки в конце строки удаляется.


# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.


...

Эквивалент JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5. Сложенный блок скаляров (>):

будет складывать новые строки в пробелы, но удаляет лишние новые строки после блока.


folded_newlines: >
 this is really a
 single line of text
 despite appearances


...

Эквивалент JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

для большего вы можете посетить мойблог

 seh06 апр. 2018 г., 15:43
Вы намеревались, например, # 4 использовать «| -» после двоеточия? Кроме того, здесь вы можете потерять маркеры конца директив "---", так как вы показываете только один документ. Маркеры конца документа полезны для выделения конечных пробелов в документах. Кроме того, нет необходимости в явных документах.
 Anthon09 нояб. 2018 г., 17:47
Nr.1 описывается как простой скаляр в стиле потока в спецификации YAML. Называть это блочным стилем вводит в заблуждение.
 Arayan Singh06 апр. 2018 г., 16:17
спасибо за указание. это была опечатка. А исправили это. Я предоставил маркер начала и конца, чтобы каждый мог видеть новые строки после строки.

Объединить длинные строкибез пробелов, используйте двойные кавычки и экранируйте символы обратной косой черты:

key: "Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemp\
  orincididuntutlaboreetdoloremagnaaliqua."

(Спасибо @Tobia)

 gertas31 авг. 2017 г., 11:58
Отлично, отлично работает с Ansible.
 Martijn Heemels30 нояб. 2017 г., 10:53
Ах, наконец. Я пытался обернуть длинные ssh-ключи в файлы yaml Hiera в Puppet несколькими строками, но всегда получал ненужные пробелы, пока не использовал ваш ответ. Благодарю.
 Mike Mitterer03 авг. 2017 г., 12:05
Спасибо, это действительно помогло мне определить объемы Docker для нескольких строк! Если у кого-то есть такая же проблема,вот мое решение на онлайн-парсере YAML

5 6 ДЕВЯТЬ (или 63 *, в зависимости от того, как вы считаете) разные способы написания многострочных строк в YAML.

TL; DR

Обычно вы хотите>:

key: >
  Your long
  string here.

Если вы хотите, чтобы разрывы строк были сохранены как\n в строке (например, встроенная уценка с абзацами) используйте|.

key: |
  ### Heading

  * Bullet
  * Points

использование>- или же|- вместо этого, если вы не хотите, чтобы разрыв строки добавлялся в конце.

Если вам нужно разбить строки в середине слов или буквально ввести переносы строк, как\nиспользуйте вместо этого двойные кавычки:

key: "Antidisestab\
 lishmentarianism.\n\nGet on it."

YAML сумасшедший

Блокировать скалярные стили (>, |)

Они позволяют такие символы, как\ а также" без экранирования и добавления новой строки (\n) до конца вашей строки.

> Сложенный стиль удаляет одиночные символы новой строки в строке (но добавляет один в конце и преобразует двойные строки в одиночные):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| Буквальный стиль превращает каждую новую строку в строке в буквальную новую строку и добавляет один в конце:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Вот официальное определение изYAML Spec 1.2

Скалярное содержимое может быть записано в блочной нотации, используя буквальный стиль (обозначенный «|»), где все разрывы строк являются значительными. В качестве альтернативы, они могут быть записаны в сложенном стиле (обозначается «>»), где каждый разрыв строки свернут в пробел, если он не заканчивается пустой или более отступой строкой.

Стили блоков с индикатором блокировки блоков (>-, |-, >+, |+)

Вы можете контролировать обработку последней новой строки в строке и любых завершающих пустых строк (\n\n) добавивИндикатор блокада персонаж:

>, |: "clip": сохранить перевод строки, удалить завершающие пустые строки.>-, |-: "strip": удалить перевод строки, удалить завершающие пустые строки.>+, |+: "keep": сохранить перевод строки, оставить после себя пустые строки.«Поток» скалярных стилей (, ", ')

Они имеют ограниченный выход и создают однострочную строку без символов новой строки. Они могут начинаться с той же строки, что и ключ, или сначала с новых строк.

простой стиль (нет выхода, нет# или же: комбинации, ограничения на первый символ):

Key: this is my very very very 
  long string

стиль в двойных кавычках (\ а также" должен быть сброшен\, новые строки могут быть вставлены с литералом\n последовательность, строки могут быть объединены без пробелов с конечным\):

Key: "this is my very very \"very\" loooo\
  ng string.\n\nLove, YAML."

"this is my very very \"very\" loooong string.\n\nLove, YAML."

стиль в одинарных кавычках (дословный' должно быть удвоено, без специальных символов, возможно, полезно для выражения строк, начинающихся с двойных кавычек):

Key: 'this is my very very "very"
  long string, isn''t it.'

"this is my very very \"very\" long string, isn't it."

Резюме

В этой таблице_ средстваspace character. \n означает «символ новой строки» (\n в JavaScript), за исключением строки «inline inline», где это означает буквально обратную косую черту и n).

                      >     |            "     '     >-     >+     |-     |+
-------------------------|------|-----|-----|-----|------|------|------|------  
Trailing spaces   | Kept | Kept |     |     |     | Kept | Kept | Kept | Kept
Single newline => | _    | \n   | _   | _   | _   | _    |  _   | \n   | \n
Double newline => | \n   | \n\n | \n  | \n  | \n  | \n   |  \n  | \n\n | \n\n
Final newline  => | \n   | \n   |     |     |     |      |  \n  |      | \n
Final dbl nl's => |      |      |     |     |     |      | Kept |      | Kept  
In-line newlines  | No   | No   | No  | \n  | No  | No   | No   | No   | No
Spaceless newlines| No   | No   | No  | \   | No  | No   | No   | No   | No 
Single quote      | '    | '    | '   | '   | ''  | '    | '    | '    | '
Double quote      | "    | "    | "   | \"  | "   | "    | "    | "    | "
Backslash         | \    | \    | \   | \\  | \   | \    | \    | \    | \
" #", ": "        | Ok   | Ok   | No  | Ok  | Ok  | Ok   | Ok   | Ok   | Ok
Can start on same | No   | No   | Yes | Yes | Yes | No   | No   | No   | No
line as key       |
Примеры

Обратите внимание на конечные пробелы в строке перед «пробелами».

- >
  very "long"
  'string' with

  paragraph ,gap, \n and        
  spaces.
- | 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- very "long"
  'string' with

  paragraph gap, \n and        
  spaces.
- "very \"long\"
  'string' with

  paragraph gap, \n and        
  s\
  p\
  a\
  c\
  e\
  s."
- 'very "long"
  ''string'' with

  paragraph gap, \n and        
  spaces.'
- >- 
  very "long"
  'string' with

  paragraph gap, \n and        
  spaces.

[
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces.\n", 
  "very \"long\"\n'string' with\n\nparagraph gap, \\n and        \nspaces.\n", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", 
  "very \"long\" 'string' with\nparagraph gap, \\n and         spaces."
]
Стили блоков с индикаторами отступов

На случай, если вышеперечисленного недостаточно для вас, вы можете добавить "индикатор отступа блока"(после индикатора блокировки блока, если он у вас есть):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here
добавление

Если вы вставите лишние пробелы в начале не первых строк в стиле «Сложенный», они будут сохранены с бонусной новой строкой. Этого не происходит со стилями потока:

- >
    my long
      string
- my long
    string

["my long\n string\n", "my long string"]

Я даже не могу.

*2 стиля блока, каждый с 2-мя возможными индикаторами сочетания блоков (или без них) и с 9-ю возможными индикаторами отступа (или без), 1 простой стиль и 2 указанных стиля: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Часть этой информации также была обобщенаВот.

 xdhmoore07 авг. 2018 г., 23:29
Еще один многострочный синтаксис строки
 pepoluan25 авг. 2016 г., 19:06
Точно такой же вопрос, как у @Tobia ... Я ищу "безбрежную конкатенацию".
 Robert Jack Will31 мар. 2016 г., 15:02
Обратите внимание, что, очевидно, не все парсеры YAML реализуют это полностью. Мы используем Джексона (2.5.3) в Java и>- не удаляет все новые строки. Мы переключились на «простой стиль» переполнения, и это делает то, что нам нужно.
 wvxvw18 янв. 2018 г., 09:56
В конечном итоге это самый лучший формат для организации структурированных данных, которые я когда-либо видел! Я думаю, что этого ответа очень не хватает, хотя это список реализаций парсера YAML и какие функции они поддерживают. По моему опыту, большинство из них вообще не поддерживают индикаторы чомпинга, но способы их обработки различны.
 Ryan Fisher07 мая 2018 г., 01:49
«Если вы вставите лишние пробелы в начале не первых строк в стиле« Сложенный », они будут сохранены с бонусной новой строкой». - это бесит
 Vicky Chijwani31 янв. 2018 г., 20:51
@wvxvw извините, да, я тоже считаю, что сложно передать сарказм в письменной форме. Особенно в таком случае, потому что я знаю людей, которые действительноделать думаю, что YAML отличный формат :). Ура!
 udondan15 мар. 2016 г., 08:38
Есть еще больше опций, когда вы смотрите на индикатор блокада.|2+ сохранит пробелы в начале строки, которые превышают 2 пробела.
 Steve Bennett01 мар. 2018 г., 04:28
Спасибо, пояснил, что экранирование не требуется в режиме блокировки.
 tinita26 февр. 2018 г., 19:11
«Они позволяют экранировать» Блочные скаляры не позволяют экранировать последовательности. Только двойные кавычки поддерживают это.
 udondan04 мар. 2018 г., 13:36
Кто-то сделал сайт на эту тему:yaml-multiline.info @SteveBennett ㄹ Если вы не знали, проверьте нижний колонтитул этой страницы.
 Steve Bennett13 сент. 2018 г., 01:03
Вау, спасибо, что спросили @jeffreyveon, я полностью упустил, что я должен открыть это как URL, упс.
 jeffreyveon06 сент. 2018 г., 13:53
@Tobia Можете ли вы привести пример для "безпространственного объединения"? Я не умею грокатьExample: data:text/plain;base64,dGVzdDogImZvb1wKICBiYXIiCg==
 ThorSummoner02 мая 2017 г., 02:07
pyyaml кажется, чтобы сохранить новые строки на> стилевые строки: \ я в конечном итоге избежал перевода строки с обратной косой черты
 tinita03 мар. 2018 г., 23:06
Я только что написал статью, которая подразумевает более полную ссылку на все стили строк, может быть, это полезно для некоторых:blogs.perl.org/users/tinita/2018/03/...
 Tobia28 июл. 2016 г., 17:33
Как вы думаете, из 63 синтаксисов есть один, который позволяет вам записать в несколько строк строку, в которой не должно быть ни новой строки, ни пробелов? Я имею в виду, что можно написать как"..." + "..." в большинстве языков программирования или обратная косая черта перед новой строкой в ​​Bash.
 sudo22 июл. 2018 г., 20:32
@VickyChijwani Да, я не уверен, что YAML даже хуже, чем XML, но он близок. Каждый раз, когда я что-то настраиваю неправильно, это из-за чего-то непонятного в YAML. Или я не правильно понял свое пространство. Нужно смотреть на мой экран с увеличительным стеклом, если я не использую супер YAML-дружественный редактор.
 Steve Bennett26 авг. 2016 г., 11:11
Ах, спасибо - это (пропущенная обратная косая черта => без пробела) это поведение, которое я пропустил. Кажется уникальным для строк в двойных кавычках.
 emmdee29 мар. 2019 г., 06:24
Отличная информация, как мне сохранить отступ для многострочной строки?
 Vicky Chijwani31 янв. 2018 г., 15:48
@wvxvw, напротив, я думаю, что YAML является худшим форматом для многих распространенных сценариев использования (например, файлов конфигурации), не в последнюю очередь потому, что большинство людей привлекают своей очевидной простотой, только чтобы гораздо позже понять, что это чрезвычайно сложный формат. YAML делает неправильные вещисмотреть правильно - например, безобидная толстая кишка: внутри одной строки в массиве строк YAML интерпретирует его как массив объектов. Это нарушаетпринцип наименьшего удивления.
 wvxvw31 янв. 2018 г., 16:52
@VickyChijwani Мы потерялись в переводе. Мой комментарий был саркастическим, но сарказм плохо переводится. Я очень согласен с вами.
 Steve Bennett29 мар. 2019 г., 11:49
Если вы используете>1 или же|1, затемнемного отступ будет сохранен. Например, если> находится в 3-м столбце (два пробела с отступом), тогда символы отступа X-3 будут сохранены.
 Tobia12 сент. 2018 г., 12:35
@jeffreyveon Это просто способ поделиться буквальным фрагментом текста через ограничения системы комментариев. Это URI данных, вы просто вставляете его в адресную строку браузера.
 Tobia26 авг. 2016 г., 10:56
@pepoluan Я перепробовал каждую возможную комбинацию и нашел только одну, которая допускает конкатенацию без пробелов: ставьте двойные кавычки вокруг строки и обратную косую черту перед новой строкой (и отступом). Пример: data: text / plain; base64, dGVzdDogImZvb1wKICBiYXIiCg ==
 swenzel21 июн. 2019 г., 10:55
Я всегда изо всех сил пытался вспомнить, какой из '|' или '>' сохраняет или удаляет перевод строки. В какой-то момент я понял, что при чтении слева направо операторы сообщают вам, как они преобразуют строку. '|' имеет одинаковую высоту с обеих сторон, что означает, что нить также будет оставаться одинаковой высоты; в то время как «>» меньше справа, чем слева, это означает, что он «сжимает» строку из множества строк до одной строки. Просто хотел оставить это мнемонику здесь для тех, кто еще не открыл ее.

вы не поверите, но YAML также может выполнять многострочные ключи:

?
 >
 multi
 line
 key
:
  value
 Richard-Degenne11 дек. 2017 г., 15:49
Любой пример реального использования для этого?
 goFrendiAsgard09 окт. 2017 г., 03:33
@ilyaigpetrov в точности как написано, «многострочный» ключ. Обычно вы делаете такие вещи, какkey:value, но если ваш ключ содержит новую строку, вы можете сделать это, как описано выше
 ilyaigpetrov26 сент. 2017 г., 13:38
Требуется пояснение (что такое "?").
 Anthon09 нояб. 2018 г., 17:51
@ilyaigpetrov the? является ключевым индикатором (как в ключе в отображении). Во многих ситуациях вы можете не указывать ключевой индикатор, когда (обязательный) индикатор значения: после того как ключ делает разбор однозначным. Но это не тот случай, вам придется использовать это, чтобы явно пометить ключ.

когда строка может содержать пробелы или нет, я предпочитаю двойные кавычки и продолжение строки с обратными слешами:

key: "String \
  with long c\
  ontent"

Но обратите внимание на ловушку для случая, когда линия продолжения начинается с пробела, ее нужно экранировать (потому что она будет удалена в другом месте):

key: "String\
  \ with lon\
  g content"

Если строка содержит разрывы строк, это должно быть написано в стиле C\n.

Смотрите такжеэтот вопрос.

 Anthon09 нояб. 2018 г., 17:54
Если он будет удаленв другом местене в этой позиции, можете ли вы обновить свой ответ информацией огде это будет убрано. Пожалуйста, также напишите, какой парсер (для какого языка) это делает? Я видел только парсеры, удаляющие такие пробелы в многострочных кавычкахна месте.
Решение Вопроса

каждый разрыв строки заменяется пробелом. Отступ в каждой строке будет игнорироваться. В конце будет вставлен разрыв строки.

>
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with only a single carriage return appended to the end.

http://symfony.com/doc/current/components/yaml/yaml_format.html

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

>-
  This is a very long sentence
  that spans several lines in the YAML
  but which will be rendered as a string
  with NO carriage returns.

Также доступны другие инструменты управления (например, для управления отступами).

Увидетьhttps://yaml-multiline.info/

 Alexander Mills31 мая 2019 г., 00:23
что это?Key: > string или жеKey > строка или что?
 ffghfgh01 июл. 2015 г., 19:07
 DylanYoung27 нояб. 2018 г., 16:46
@Rvanlaak и @ rich-remer Используйте блокпост, чтобы избежать перевода строки в конце:>-
 Rvanlaak06 мая 2015 г., 16:48
Каким-то образом возврат каретки добавляется сразу после окончания перевода в моем приложении. Таким образом, Javascript видит его как несколько строк и терпит неудачу.{{- 'key'|trans -}} тоже не работает.
 Travis Bear30 сент. 2016 г., 20:41
Этот ответ хорош, но ответ Мэтта Уильямсона ниже должен быть принятым.
 jjkparker27 сент. 2010 г., 18:55
Спасибо, но вы не можете заключить этот синтаксис в кавычки, кажется: кавычки появляются в виде литералов в результирующей строке.
 Jean Jordaan05 авг. 2018 г., 12:57
каждый разрыв строки заменяется пробелом <- но двойной разрыв строки будет переводом строки.
 Steve25 июл. 2017 г., 20:00
каждый разрыв строки заменяется пробелом или просто удаляется?
 Rich Remer22 мар. 2018 г., 01:41
По моему опыту, этот синтаксис добавляет\n в конце строки. Это может или не может быть то, что вы ищете.
 Mikhail02 июн. 2015 г., 04:17
Как бы вы получили такой же эффект, как значение в списке?

Ваш ответ на вопрос