Як перервати рядок на кілька рядків?


1537

У YAML у мене дуже довга струна. Я хочу зберегти це в перегляді 80-стовпчиків мого редактора, тому я хотів би перервати рядок. Який для цього синтаксис?

Іншими словами, у мене це:

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

і я хотів би мати це (або щось в цьому плані):

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

Я хотів би використовувати лапки, як описано вище, тому мені не потрібно нічого уникати в рядку.

Відповіді:


977

Використовуючи складний стиль yaml, кожен розрив рядка замінюється пробілом. Відступ у кожному рядку буде проігноровано. У кінці буде вставлено перерву рядка.

Key: >
  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

Для усунення розриву кінцевої лінії можна використовувати "індикатор блокування блоку" таким чином:

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


Дякую, але ви не можете зафіксувати цей синтаксис у лапках, схоже: лапки відображаються як буквені знаки в отриманому рядку.
jjkparker

Як-небудь додається повернення вагона відразу після закінчення перекладу в моєму додатку. Таким чином Javascript сприймає це як декілька рядків і виходить з ладу. {{- 'key'|trans -}}теж не працює.
Rvanlaak

Як би ви отримали такий самий ефект, як значення у списку?
Михайло

кожен перерив рядка замінюється пробілом або просто видаляється?
Стів

2
кожен перерив рядка замінюється пробілом <- але перерва дворядкової лінії буде розривом рядка.
Жан Йордан

3351

Існує 5 6 дев'яти (або 63 *, залежно від того, як ви рахуєте) різних способів запису багаторядкових рядків у YAML.

TL; DR

  • Зазвичай вам потрібно >:

    key: >
      Your long
      string here.
    
  • Якщо ви хочете, щоб \nрядкові рядки зберігалися як у рядку (наприклад, вбудована розмітка з абзацами), використовуйте |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Використовуйте >-або |-замість цього, якщо ви не хочете, щоб рядковий рядок додався в кінці.

  • Якщо вам потрібно розділити рядки в середині слів або буквально ввести рядкові рядки як \n, використовуйте замість цього подвійні лапки:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • ЯМЛ божевільний.

Блокувати скалярні стилі ( >, |)

Вони дозволяють таким символам, як \і "без втечі, і додають новий рядок ( \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": видаліть подачу рядків, видаліть проміжні порожні рядки.
  • >+, |+: "утримувати": зберігати канал рядків, тримати пробіли в рядках.

"Потік" стилі скалярні ( , ", ')

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

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

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), за винятком рядка "рядкові нові рядки", де він означає буквально зворотну косу рису та 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

Частина цієї інформації також була узагальнена тут .


28
Як ви думаєте, серед 63 синтаксисів є один, який дозволяє написати в декількох рядках рядок, який не повинен мати ні рядків, ні пробілів? Я маю на увазі те, що можна було б написати, як "..." + "..."у більшості мов програмування, або зворотній косої риски перед новим рядком у Bash.
Tobia

23
@pepoluan Я спробував усі можливі комбінації і знайшов лише одну, яка дозволяє безпросторового конкатенації: покладіть подвійні лапки навколо рядка та зворотної косої риски перед новим рядком (та відступом.) Приклад: text / plain; base64, dGVzdDogImZvb1wKICBiYXIiCg ==
Tobia

42
@wvxvw навпаки, я вважаю, що YAML - це найгірший формат для багатьох поширених випадків використання (наприклад, конфігураційні файли), не в останню чергу тому, що більшість людей притягується за своєю очевидною простотою, щоб значно пізніше зрозуміти, що це надзвичайно складний формат. YAML робить неправильні речі виглядати правильно - наприклад, невинне двокрапка в :межах одного рядка в масиві рядків робить YAML інтерпретувати його як масив об'єктів. Це порушує принцип найменшого здивування .
Vicky Chijwani

20
Хтось створив веб-сайт на цю тему: yaml-multiline.info @SteveBennett ㄹ Якщо ви не знали, перевірте колонтитул цієї сторінки.
Udondan

38
Ще один синтаксис
багаторядкових

186

Для збереження нових рядків використовуйте |, наприклад:

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

перекладається на "Це дуже довге речення‌ \ n, яке охоплює кілька рядків у YAML‌ \ n, але яке буде відображено у вигляді рядка‌ \ n із збереженими новими рядками. \ n "


Здається, це працює добре для мене з двома рядками, але не з трьома?
cboettig

Дякую, там добре працює, як ти кажеш. З якихось причин у заголовках ямла Pandoc мені потрібно повторити |кожен рядок із незрозумілих мені причин: groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
cboettig

1
Цей приклад НЕ перетворює на нові рядки в рейках 4!
Rubytastic

Чи не проблема в тому, що якщо я напишу: - field1: | один два - поле1: | три для 'я отримую: один \ nдво \ n і три \ nза? Я б розглядав \ n після 2, щоб його не було ...
Alain1405

При використанні багаторядкової catлінії з роздільником це призводить до того, що до виводу додаються провідні пробіли (необхідні для YAML).
Карл Ріхтер

109

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"
}

докладніше ви можете відвідати мій блог


Чи планували ви, наприклад, №4 використовувати "| -" після двокрапки? Також тут ви можете втратити кінцеві маркери директив "---", оскільки ви показуєте лише один документ. Кінцеві маркери документа корисні для виділення пробілу в кінці. Крім цього, однак, немає необхідності в явних документах.
seh

дякую за вказівку. це був друкарський помилок. А це виправили. Я надав початковий і кінцевий маркер, щоб кожен міг бачити нові рядки після рядка.
Араян Сінгх

У специфікації YAML Nr.1 ​​описується як звичайний, скалярний стиль. Називати його блоковим стилем вводить в оману.
Антон

Змінює №1 як звичайний, потоковий стиль, скалярний.
Араян Сінгх

42

Ви можете не повірити, але YAML також може робити багаторядкові клавіші:

?
 >
 multi
 line
 key
:
  value

3
Потрібно пояснення (що таке "?").
ilyaigpetrov

@ilyaigpetrov точно так, як написано, "багаторядковий" ключ. Зазвичай ви робите подібні речі key:value, але якщо ваш ключ містить новий рядок, ви можете зробити це, як описано вище
goFrendiAsgard

4
Будь-який приклад використання справжнього випадку для цього?
Річард-Деген

1
@ilyaigpetrov the ?є основним індикатором (як у ключі у відображенні). У багатьох ситуаціях ви можете залишити ключовий індикатор, коли індикатор (обов'язкове) значення :після ключа робить однозначний розбір. Але це не так, вам доведеться використовувати це для явного позначення ключа.
Антон

42

Щоб об'єднати довгі рядки без пробілів , використовуйте подвійні лапки та вийдіть з нових рядків із зворотним нахилом:

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

(Дякую @Tobia)


Дякую, це дійсно допомогло мені визначити обсяги Докера в декількох рядках! Якщо хтось має таку ж проблему, ось моє рішення на Інтернет-аналізаторі YAML
Майк Міттерер

А нарешті. Я намагався загорнути довгі ssh-ключі у файли Yaml Puppet-ямли через декілька рядків, але завжди отримував небажані пробіли, поки я не використав вашу відповідь. Дякую.
Martijn Heemels

18

Якщо ви використовуєте YAML та Twig для перекладів в Symfony та хочете використовувати багаторядковий переклад у 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.";

Це схоже на помилку. Чи мали ви можливість подати звіт про помилку?
dreftymac

8

Для ситуацій, якщо рядок може містити пробіли чи ні, я віддаю перевагу подвійним лапочкам та продовження рядків з косою рисою:

key: "String \
  with long c\
  ontent"

Але зауважте про підводний камінь для випадку, коли лінія продовження починається з пробілу, його потрібно уникнути (оскільки його буде знято в іншому місці):

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

Якщо рядок містить розриви рядків, це повинно бути написано в стилі C \n.

Дивіться також це питання .


Якщо його позбавлять в іншому місці , тобто не в такому положенні, чи можете ви оновити свою відповідь інформацією про те, де вона буде позбавлена. Будь ласка, напишіть, який парсер (для якої мови) це робить? Я тільки бачив парсери смуги такі провідні / кінцеві прогалини в багаторядкові лапки рядків у місці .
Антон

0

Жодне з перерахованих вище рішень не працювало для мене у файлі YAML в рамках проекту Jekyll. Спробувавши багато варіантів, я зрозумів, що введення HTML з "" <br>може бути також добре, оскільки врешті-решт все надається в HTML:

ім'я: | У селі Ла-Манча <br>, ім'я якого я не <br>хочу згадувати.

Принаймні, це працює для мене. Немає уявлення про проблеми, пов'язані з цим підходом.


2
Ваше рішення стосується іншої проблеми: у вашому випадку ви хочете, щоб переривання рядків відображалося у виведеному HTML в результаті обробки YAML. HTML і YAML не мають між собою неявних зв’язків. І навіть якщо YAML передаватиме звичайні розбиття рядків, HTML ігнорував би їх. Врешті-решт питання оператора пов'язане з використанням розривів лінії в самій YAML, щоб запобігти дуже довгі лінії. Це не байдуже, як можуть бути надані дані в кінцевому підсумку. Навіщо це казати? Тому що це пояснює, чому всі інші рішення, наведені тут, не працюють у вашому випадку.
Томас Урбан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.