Программирование

Как разбить длинную строку в YAML на несколько строк

Как разбить yaml строки на несколько строк в YAML: используйте folded (>) для сглаживания в пробелы или literal (|) для сохранения yaml перенос строки. Chomping, кавычки без экранирования, примеры в PyYAML и Ansible. Избегайте конкатенации +.

Как разбить длинную строку в YAML на несколько строк?

У меня есть очень длинная строка в формате YAML:

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

Я хотел бы представить её на нескольких более коротких строках, например:

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

Я хочу сохранить кавычки, чтобы не пришлось экранировать специальные символы внутри строки. Какой правильный способ разбивать строки YAML на несколько строк, сохраняя их содержимое?

В YAML разбить длинную строку на несколько строк проще простого — используйте yaml multiline с блоковыми скалярами: folded style (>) заменит переносы пробелами, а literal style (|) сохранит yaml перенос строки как \n. Забудьте про конкатенацию вроде + — это не сработает, YAML так не работает. Вместо этого просто ставьте > или | после ключа, и строка разобьется визуально, сохранив кавычки внутри без лишнего экранирования.


Содержание


Почему нельзя использовать + в YAML

Сначала разберемся, почему ваш пример с + не взлетит. YAML — это не Python или JavaScript, здесь нет оператора конкатенации строк. Если попробовать

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

парсер просто сломается или проигнорирует вторую строку. А ведь вы хотите yaml строки представить аккуратно, без потери смысла.

По данным Stack Overflow, правильный путь — блоковые скаляры. Они появились в спецификации YAML именно для таких случаев: длинный текст, который мешает читать конфиг. И да, кавычки внутри можно оставить как есть — YAML их не тронет.

Но что выбрать: сжать в одну строку или сохранить разрывы? Зависит от задачи. Давайте разберем по полочкам.


Folded style (>) для yaml multiline

Folded style с > — идеал для yaml multiline, когда логически строка одна, а переносы только для красоты. YAML заменит каждый перенос на пробел, лишние сломаются.

Пример из yaml-multiline.info:

yaml
key: >
 this is my very very very
 long string that folds into one line

Результат после парсинга: "this is my very very very long string that folds into one line".

Круто, правда? Две пустые строки подряд станут одним пробелом, а финальный перенос — одним. Если строка кончится словом посреди — не проблема, YAML сломает аккуратно.

Хотите пример побольше? Представьте описание в Docker Compose:

yaml
services:
 app:
 image: nginx
 command: >
 sh -c "echo 'Starting app' &&
 nginx -g 'daemon off;'"

Здесь все слепится в одну команду. Быстро. Читаемо. Без \n.


Literal style (|) и сохранение переносов

А если нужны настоящие yaml перенос строки? Тогда | — ваш выбор. Это literal block: YAML сохранит каждый \n как есть, включая отступы.

Смотрите Symfony YAML docs:

yaml
message: |
 Первая строка.
 Вторая строка с переносом.
 Третья.

Парсинг даст: "Первая строка.\nВторая строка с переносом.\nТретья.\n".

Отступы важны! Первый отступ после | задает базовый — YAML их обрежет. Полезно для Markdown в конфигах или логов.

Бывает, что в Ansible playbook’ах playbook’ы с | оживают:

yaml
- name: Write multiline config
 copy:
 content: |
 server {
 listen 80;
 root /var/www;
 }

Тут каждый блок — отдельный абзац. Никакого сглаживания.


Chomping: управление концом строки

По умолчанию блок добавит \n в конец. Не всегда нужно. Вот for-each.dev объясняет chomping:

  • > или | — добавит один \n в конец (clip).
  • >- или |- — уберет trailing \n (strip).
  • >+ или |+ — сохранит все trailing \n (keep).

Пример:

yaml
key: >-
 Line one
 Line two

key2: |-
 Block with no trailing newline.

Первый сломается в "Line one Line two". Второй — "Block with no trailing newline." без лишнего.

Почему это важно? В скриптах или JSON-дампах лишний \n может сломать все. Тестируйте в PyYAML:

python
import yaml
data = yaml.safe_load("""
key: >-
 test
""")
print(repr(data['key'])) # 'test'

Просто и мощно.


Сохранение кавычек без экранирования

Вы просили сохранить кавычки — блоковые скаляры это позволяют! Внутри > или | кавычки — просто символы, не экранируйте.

Из Habr статьи:

yaml
sql: >
 SELECT * FROM users WHERE name = 'O''Reilly'

Парсер увидит 'O''Reilly' как есть. Без \' или \". Сравните с flow-style:

yaml
bad: "it's \"quoted\""

Блоки выигрывают для сложного текста. А если кавычки снаружи нужны — YAML сам разберется.


Практические примеры в PyYAML и Ansible

В реальной жизни yaml multiline string светит в инструментах. PyYAML парсит идеально:

python
import yaml
yaml_str = """
long_text: |
 Строка номер один.
 Еще одна с yaml перенос строки.
"""
print(yaml.safe_load(yaml_str)['long_text'])
# Вывод: Строка номер один.\nЕще одна с yaml перенос строки.\n

Ansible? Легко, по it-swarm:

yaml
- debug:
 msg: >-
 Debug message with folding.
 And more lines here.

Масштабируйте на GitHub Actions или Kubernetes manifests — везде работает.

А если в ключ многострочный? YAML позволяет, но редко юзают:

yaml
? |
 Multi
 line key
: value

Частые ошибки при работе с yaml строки

Новички спотыкаются:

  1. Отступы сломаны — YAML чувствителен, держите консистентно.
  2. Забыли chomping — лишние \n в конце.
  3. Путаница > и | — folded для одной строки, literal для блоков.
  4. Кавычки внутри flow — экранирование убивает читаемость, sprosi.pro советует блоки.

Тестируйте всегда: yaml.dump в Python покажет, как парсер видит.

Еще: не все парсеры одинаковы. PyYAML строгий, но старые версии Ansible могут глючить на сложных блоках.


Источники

  1. Stack Overflow: How do I break a string in YAML over multiple lines?
  2. YAML Multiline Strings
  3. Symfony YAML Documentation
  4. Habr: Некоторые приемы YAML
  5. for-each.dev: YAML Multi-line
  6. it-swarm: В YAML как разбить строку
  7. sprosi.pro: В YAML как разбить строку
  8. Learn YAML in Y Minutes (ru)

Заключение

Разбить yaml строки на несколько — это > для сглаженного yaml multiline или | для буквальных переносов, плюс chomping для точного контроля. Кавычки сохранятся сами, без гемора. В 99% случаев folded хватит, но тестируйте на вашем парсере. Теперь ваши конфиги станут читаемыми — и коллегам спасибо скажут.

Авторы
Проверено модерацией
Модерация
Как разбить длинную строку в YAML на несколько строк