Как разбить длинную строку в 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
- Folded style (>) для yaml multiline
- Literal style (|) и сохранение переносов
- Chomping: управление концом строки
- Сохранение кавычек без экранирования
- Практические примеры в PyYAML и Ansible
- Частые ошибки при работе с 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:
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:
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:
message: |
Первая строка.
Вторая строка с переносом.
Третья.
Парсинг даст: "Первая строка.\nВторая строка с переносом.\nТретья.\n".
Отступы важны! Первый отступ после | задает базовый — YAML их обрежет. Полезно для Markdown в конфигах или логов.
Бывает, что в Ansible playbook’ах playbook’ы с | оживают:
- 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).
Пример:
key: >-
Line one
Line two
key2: |-
Block with no trailing newline.
Первый сломается в "Line one Line two". Второй — "Block with no trailing newline." без лишнего.
Почему это важно? В скриптах или JSON-дампах лишний \n может сломать все. Тестируйте в PyYAML:
import yaml
data = yaml.safe_load("""
key: >-
test
""")
print(repr(data['key'])) # 'test'
Просто и мощно.
Сохранение кавычек без экранирования
Вы просили сохранить кавычки — блоковые скаляры это позволяют! Внутри > или | кавычки — просто символы, не экранируйте.
Из Habr статьи:
sql: >
SELECT * FROM users WHERE name = 'O''Reilly'
Парсер увидит 'O''Reilly' как есть. Без \' или \". Сравните с flow-style:
bad: "it's \"quoted\""
Блоки выигрывают для сложного текста. А если кавычки снаружи нужны — YAML сам разберется.
Практические примеры в PyYAML и Ansible
В реальной жизни yaml multiline string светит в инструментах. PyYAML парсит идеально:
import yaml
yaml_str = """
long_text: |
Строка номер один.
Еще одна с yaml перенос строки.
"""
print(yaml.safe_load(yaml_str)['long_text'])
# Вывод: Строка номер один.\nЕще одна с yaml перенос строки.\n
Ansible? Легко, по it-swarm:
- debug:
msg: >-
Debug message with folding.
And more lines here.
Масштабируйте на GitHub Actions или Kubernetes manifests — везде работает.
А если в ключ многострочный? YAML позволяет, но редко юзают:
? |
Multi
line key
: value
Частые ошибки при работе с yaml строки
Новички спотыкаются:
- Отступы сломаны — YAML чувствителен, держите консистентно.
- Забыли chomping — лишние
\nв конце. - Путаница > и | — folded для одной строки, literal для блоков.
- Кавычки внутри flow — экранирование убивает читаемость, sprosi.pro советует блоки.
Тестируйте всегда: yaml.dump в Python покажет, как парсер видит.
Еще: не все парсеры одинаковы. PyYAML строгий, но старые версии Ansible могут глючить на сложных блоках.
Источники
- Stack Overflow: How do I break a string in YAML over multiple lines?
- YAML Multiline Strings
- Symfony YAML Documentation
- Habr: Некоторые приемы YAML
- for-each.dev: YAML Multi-line
- it-swarm: В YAML как разбить строку
- sprosi.pro: В YAML как разбить строку
- Learn YAML in Y Minutes (ru)
Заключение
Разбить yaml строки на несколько — это > для сглаженного yaml multiline или | для буквальных переносов, плюс chomping для точного контроля. Кавычки сохранятся сами, без гемора. В 99% случаев folded хватит, но тестируйте на вашем парсере. Теперь ваши конфиги станут читаемыми — и коллегам спасибо скажут.