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

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

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

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

и я хотел бы иметь это (или что-то в этом роде):

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

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

Ответ 1

Используя стиль сгиба 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/

Ответ 2

Существует 5 6 NINE (или 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 => |      |      |     |     |     |      | 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

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

Ответ 3

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

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

Ответ 4

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. Скаляр Literal Block: Скаляр Literal Block | будет включать переводы строки и любые пробелы в конце. но удаляет лишние

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

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

для получения дополнительной информации вы можете посетить мой блог

Ответ 5

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

?
 >
 multi
 line
 key
:
  value

Ответ 6

Чтобы объединить длинные строки без пробелов, используйте двойные кавычки и избегайте строк новой строки с помощью обратных косых черт:

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

(Спасибо @Tobia)

Ответ 7

Если вы используете 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.";

Ответ 8

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

key: "String \
  with long c\
  ontent"

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

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

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

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

Ответ 9

Ни одно из перечисленных выше решений не сработало для меня, в файле YAML в проекте Jekyll. Перепробовав много вариантов, я понял, что HTML-инъекция с <br> тоже может сработать, так как в итоге все отображается в HTML:

имя: | В деревне Ла - Манча <br> имя которого я не <br> хотите запомнить.

По крайней мере, это работает для меня. Без понятия о проблемах, связанных с этим подходом.