¿Cómo se rompe una cadena en varias líneas?

En YAML, tengo una cadena que es muy larga. Quiero mantenerlo dentro de la vista de 80 columnas (más o menos) de mi editor, así que me gustaría romper la cadena. ¿Cuál es la sintaxis para esto?

En otras palabras, tengo esto:

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

y me gustaría tener esto (o algo parecido):

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

Me gustaría usar las comillas como en el caso anterior, para no tener que escapar nada dentro de la cadena.

Hay 5 6 Nueve (o 63*, según se cuente) formas diferentes de escribir cadenas de varias líneas en YAML.

TL;DR

  • Por lo general, usted quiere >:

      llave: >
        Su larga
        cadena aquí.
  • Si quieres que los saltos de línea se conserven como \n en la cadena (por ejemplo, markdown incrustado con párrafos), utiliza |.

      clave: |
        ### Título
    
        ### Bullet
        * Puntos
  • Utilice >- o |- si no desea que se añada un salto de línea al final.

  • Si necesita dividir las líneas en medio de las palabras o escribir literalmente los saltos de línea como \n, utilice las comillas dobles en su lugar:

      clave: "Antidisestab\
       lishmentarianism.\n\nPonte a ello".
  • YAML es una locura.

Estilos escalares (>, |)

Estos permiten caracteres como \ y " sin escapar, y añaden una nueva línea (\n) al final de su cadena.

> Estilo doblado elimina las nuevas líneas simples dentro de la cadena (pero añade una al final, y convierte las nuevas líneas dobles en simples):

Key: >
  this is my very very very
  long string

esta es mi cadena muy muy larga\n.

| Estilo literal convierte cada nueva línea dentro de la cadena en una nueva línea literal, y añade una al final:

Key: |
  this is my very very very 
  long string

→ "Esta es mi cadena muy muy larga".

Aquí está la definición oficial de la YAML Spec 1.2

Los contenidos escalares pueden escribirse en notación de bloque, utilizando un estilo literal (indicado por "|") donde todos los saltos de línea son significativos. Como alternativa, pueden escribirse con el estilo plegado (indicado por ">"), en el que cada salto de línea se pliega a un espacio a menos que termine una línea vacía o con más sangría.

Estilos de bloque con indicador de salto de línea (>-, |-, >+, |+)

Puede controlar el manejo de la última línea nueva en la cadena, y cualquier línea en blanco al final de la misma (\n\n) añadiendo un carácter indicador de bloque:

  • >, |: "clip": mantiene el avance de línea, elimina las líneas en blanco finales.
  • >-, |-: "strip": elimina el salto de línea, elimina las líneas en blanco finales.
  • >+, |+: "keep": mantener el salto de línea, mantener las líneas en blanco.

Estilos escalares "Flow" (`,",'`)

Tienen un escape limitado, y construyen una cadena de una sola línea sin caracteres de nueva línea. Pueden comenzar en la misma línea que la clave, o con nuevas líneas adicionales primero.

estilo simple (sin escape, sin combinaciones # o :, límites en el primer carácter):

Key: this is my very very very 
  long string

estilo de comillas dobles (y `"` deben escaparse con, las nuevas líneas pueden insertarse con una secuencia literal \n, las líneas pueden concatenarse sin espacios con `` al final):

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

"esta es mi muy \"\Ncadena muy larga.\N-Amor, YAML".

estilo de comillas simples (el literal ' debe ser doble, sin caracteres especiales, posiblemente útil para expresar cadenas que comienzan con comillas dobles):

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

→ `"esta es mi cadena muy muy larga, ¿verdad?

Resumen

En esta tabla, _ significa carácter de espacio. \n significa "carácter de nueva línea" (\n en JavaScript), excepto en la fila de "nuevas líneas", donde significa literalmente una barra invertida y una 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       |

Ejemplos

*Nota los espacios finales en la línea antes de "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        
  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."
]

Estilos de bloque con indicadores de sangría

En caso de que lo anterior no sea suficiente para ti, puedes añadir un "indicador de indentación de bloque" (después de tu indicador de indentación de bloque, si tienes uno):

- >8
        My long string
        starts over here
- |+1
 This one
 starts here

Addendum

Si inserta espacios adicionales al comienzo de líneas que no son las primeras en el estilo plegado, se mantendrán, con una nueva línea adicional. Esto no ocurre con los estilos fluidos:

- >
    my long
      string
- my long
    string

["mi cadena larga\n", "mi cadena larga"].

Ni siquiera puedo.

``2 estilos de bloque, cada uno con 2 posibles indicadores de picado de bloque (o ninguno), y con 9 posibles indicadores de sangría (o ninguno), 1 estilo llano y 2 estilos entrecomillados: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63*

Parte de esta información también se ha resumido aquí.

Comentarios (26)
Solución

Utilizando el estilo plegado yaml, cada salto de línea se sustituye por un espacio. La sangría en cada línea será ignorada. Se insertará un salto de línea al final.

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

Para eliminar el salto de línea final se puede utilizar el "indicador de rotura de bloque", como se indica a continuación:

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.

También hay otras herramientas de control (para controlar la sangría, por ejemplo).

Véase https://yaml-multiline.info/

Comentarios (11)

Para conservar las nuevas líneas utilice |, por ejemplo:

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

se traduce como "Esta es una frase muy largan que abarca varias líneas en el YAMLn pero que se renderizará como una cadenan con las nuevas líneas preservadas.\n"

Comentarios (12)