2045 votes

Comment casser une chaîne dans YAML sur plusieurs lignes ?

Dans YAML, j'ai une chaîne de caractères qui est très longue. Je veux la conserver dans la vue de 80 colonnes (environ) de mon éditeur, et j'aimerais donc casser la chaîne. Quelle est la syntaxe pour cela ?

En d'autres termes, j'ai ça :

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

et j'aimerais avoir ceci (ou quelque chose de ce genre) :

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

J'aimerais utiliser les guillemets comme ci-dessus, afin de ne pas avoir à échapper quoi que ce soit dans la chaîne.

2 votes

Conseil rapide : vous ne peut pas placer de commentaire à l'intérieur d'un scalaire Vous ne pouvez donc pas commenter une partie de la clé ou de la valeur multiligne. Vous devez déplacer les lignes requises hors de la déclaration. stackoverflow.com/questions/20890445/

4395voto

Steve Bennett Points 4273

Il y a 5 6 NEUF (ou 63*, selon la façon dont on compte) différentes façons d'écrire des chaînes de caractères multi-lignes dans YAML.

TL;DR

  • Utilisez > la plupart du temps : les coupures de lignes intérieures sont supprimées, bien que vous en ayez une à la fin :

      key: >
        Your long
        string here.
  • Utilisez | si vous voulez que ces sauts de ligne soient préservés en tant que \n (par exemple, markdown incorporé avec des paragraphes).

      key: |
        ### Heading
    
        * Bullet
        * Points
  • Utilisez >- ou |- à la place si vous ne voulez pas qu'un saut de ligne soit ajouté à la fin.

  • Utilisez "..." si vous avez besoin de séparer les lignes au milieu des mots ou si vous voulez littéralement taper des sauts de ligne comme \n :

      key: "Antidisestab\
       lishmentarianism.\n\nGet on it."
  • YAML est fou.

Styles scalaires de blocs ( > , | )

Ceux-ci autorisent des caractères tels que \ et " sans l'échapper, et ajoutez une nouvelle ligne ( \n ) à la fin de votre chaîne.

> Style plié supprime les sauts de ligne simples dans la chaîne (mais en ajoute un à la fin, et convertit les sauts de ligne doubles en simples) :

Key: >
  this is my very very very
  long string

this is my very very very long string\n

L'espace de tête supplémentaire est conservé et entraîne des nouvelles lignes supplémentaires. Voir la note ci-dessous.

Conseil : Utilisez ceci. C'est généralement ce que vous voulez.

| Style littéral transforme chaque nouvelle ligne dans la chaîne en une nouvelle ligne littérale, et en ajoute une à la fin :

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Voici la définition officielle de l YAML Spec 1.2

Le contenu scalaire peut être écrit en notation de bloc, en utilisant un style littéral (indiqué par "|") où tous les sauts de ligne sont significatifs. Il peut également être écrit avec le style plié (indiqué par ">") où chaque saut de ligne est replié sur un espace, sauf s'il termine une ligne vide ou plus indentée.

Conseil : Utilisez ceci pour insérer texte formaté (notamment Markdown) comme valeur.

Styles de bloc avec indicateur d'écrasement de bloc ( >- , |- , >+ , |+ )

Vous pouvez contrôler la gestion de la dernière nouvelle ligne de la chaîne, et de toute ligne vierge de fin de chaîne ( \n\n ) en ajoutant un indicateur d'écrasement de bloc caractère :

  • > , | : "clip" : conserve le saut de ligne, supprime les lignes vides de fin de ligne.
  • >- , |- : "strip" : supprimer le saut de ligne, supprimer les lignes vides de fin de ligne.
  • >+ , |+ : "keep" : garde le saut de ligne, garde les lignes vides de fin de ligne.

Styles scalaires "Flow" ( , " , ' )

Ils ont un échappement limité, et construisent une chaîne de caractères d'une seule ligne sans caractères de nouvelle ligne. Ils peuvent commencer sur la même ligne que la clé, ou avec des retours à la ligne supplémentaires, qui sont supprimés. Les caractères de nouvelle ligne doublés deviennent une nouvelle ligne.

style sobre (pas d'échappement, pas de # ou : combinaisons, le premier caractère ne peut pas être " , ' ou de nombreux autres caractères de ponctuation) :

Key: this is my very very very 
  long string

Conseils : À éviter. Cela peut sembler pratique, mais vous risquez de vous tirer une balle dans le pied en utilisant accidentellement une ponctuation interdite et en déclenchant une erreur de syntaxe.

style guillemets ( \ et " doit être échappé par \ les nouvelles lignes peuvent être insérées à l'aide d'un caractère littéral. \n les lignes peuvent être concaténées sans espaces avec des lignes de queue \ ) :

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

"this is my very very \"very\" loooong string.\n\nLove, YAML."

Conseils : A utiliser dans des situations très spécifiques. C'est le seul moyen de séparer un très long jeton (comme une URL) sur plusieurs lignes sans ajouter d'espaces. Et peut-être que l'ajout de nouvelles lignes à mi-ligne peut être utile.

style guillemet simple (littéral ' doit être doublé, pas de caractères spéciaux, éventuellement utile pour exprimer des chaînes de caractères commençant par des guillemets doubles) :

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

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

Conseil : À éviter. Très peu d'avantages, surtout des désagréments.

Styles de blocs avec indicateurs d'indentation

Au cas où ce qui précède ne vous suffirait pas, vous pouvez ajouter un " indicateur d'indentation du bloc " (après votre indicateur de destruction de bloc, si vous en avez un) :

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

Note : Les espaces en tête dans le style plié ( > )

Si vous insérez des espaces supplémentaires au début des lignes qui ne sont pas les premières en style plié, ils seront conservés, avec une nouvelle ligne supplémentaire. (Cela ne se produit pas avec les styles de flux). Section 6.5 :

En outre, le pliage ne s'applique pas aux sauts de ligne entourant les lignes de texte qui contiennent des espaces blancs de tête. Notez qu'une telle ligne plus indentée peut être constituée uniquement de cet espace blanc de tête.

- >
    my long
      string

    many spaces above
- my long
      string

    many spaces above

["my long\n string\n \nmany spaces above\n","my long string\nmany spaces above"]

Résumé

Dans ce tableau, _ signifie space character . \n signifie "caractère de nouvelle ligne" ( \n en JavaScript) sauf dans la rubrique "Autres fonctions". L'"espacement" s'applique après la première ligne (qui établit l'indentation).

>

|

"

'

>-

>+

|-

|+

Les espaces et les retours à la ligne sont convertis en :

Espace arrière

_

_

_

_

_

_

Espace leader

\n_

\n_

\n_

\n_

\n_

\n_

Nouvelle ligne simple

_

\n

_

_

_

_

_

\n

\n

Double saut de ligne

\n

\n\n

\n

\n

\n

\n

\n

\n\n

\n\n

Nouvelle ligne finale

\n

\n

\n

\n

Double saut de ligne final

\n\n

\n\n

Comment créer un littéral :

Citation unique

'

'

'

'

''

'

'

'

'

Double citation

"

"

"

\"

"

"

"

"

"

Backslash

\

\

\

\\

\

\

\

\

\

Autres caractéristiques

Sauts de ligne avec \n

Nouvelles lignes sans espace avec \

# ou : en valeur

Peut commencer le même
ligne comme clé

Exemples

Notez les espaces de queue sur la ligne avant "espaces".

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

* 2 styles de bloc, chacun avec 2 indicateurs de fragmentation de bloc possibles (ou aucun), et avec 9 indicateurs d'indentation possibles (ou aucun), 1 style simple et 2 styles cités : 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Certaines de ces informations ont également été résumées ici .

0 votes

Il y a encore plus d'options si l'on regarde l'indicateur de broyage des blocs. |2+ préservera les espaces au début de la ligne qui dépassent 2 espaces.

0 votes

Notez qu'apparemment, tous les analyseurs YAML ne l'implémentent pas complètement. Nous utilisons Jackson (2.5.3) en Java et >- ne supprime pas tous les retours à la ligne. Nous sommes passés à un débordement de "style ordinaire" et cela fait ce dont nous avons besoin.

57 votes

Parmi les 63 syntaxes, pensez-vous qu'il en existe une seule qui permette d'épeler sur plusieurs lignes une chaîne de caractères qui ne doit comporter ni saut de ligne ni espace ? Je veux dire ce que l'on écrirait comme "..." + "..." dans la plupart des langages de programmation, ou backslash avant newline dans Bash.

1345voto

Matt Williamson Points 10894

Utilisation du style plié de yaml. L'indentation dans chaque ligne sera ignorée. Un saut de ligne sera inséré à la fin.

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

Vous pouvez utiliser l'indicateur "block chomping" pour éliminer le retour à la ligne, comme suit :

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.

Dans les deux cas, chaque saut de ligne est remplacé par un espace.

D'autres outils de contrôle sont également disponibles (pour contrôler l'indentation par exemple).

Voir https://yaml-multiline.info/

1 votes

Merci, mais on ne peut pas mettre cette syntaxe entre guillemets, il semble que les guillemets apparaissent comme des littéraux dans la chaîne résultante.

0 votes

D'une manière ou d'une autre, un retour chariot est ajouté juste après la fin de la traduction dans mon application. De cette façon, Javascript le voit comme plusieurs lignes et échoue. {{- 'key'|trans -}} ne fonctionne pas non plus.

0 votes

D'après mon expérience, cette syntaxe ajoute un fichier \n à la fin de la chaîne. Cela peut ou non correspondre à ce que vous recherchez.

211voto

JohnS Points 3434

Pour préserver nouvelles lignes utiliser | par exemple :

|
  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 traduit par "C'est une très longue phrase". \n qui s'étend sur plusieurs lignes dans le fichier YAML \n mais qui sera rendu sous la forme d'une chaîne de caractères \n avec les nouvelles lignes préservées. \n "

0 votes

Cela semble fonctionner correctement pour moi avec deux lignes mais pas avec trois ?

0 votes

Merci, ça marche bien ici comme vous le dites. Pour une raison quelconque, dans les en-têtes yaml de Pandoc, je dois répéter l'en-tête | sur chaque ligne, pour des raisons qui ne sont pas évidentes pour moi : groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A

1 votes

Cet exemple ne se convertit PAS en nouvelles lignes dans les rails 4 !

129voto

Arayan Singh Points 1285

1. Notation en blocs (simple, en flux, scalaire) : Les retours à la ligne deviennent des espaces et les retours à la ligne supplémentaires après le bloc sont supprimés.

---
# Note: It has 1 new line after the string
content:
    Arbitrary free text
    over multiple lines stopping
    after indentation changes...

...

Equivalent JSON

{
 "content": "Arbitrary free text over multiple lines stopping after indentation changes..."
}

2. Bloc littéral Scalaire : Un bloc littéral scalaire | inclura les retours à la ligne et les espaces de fin de ligne, mais supprimera les suppléments

des retours à la ligne après le bloc.

---
# After string we have 2 spaces and 2 new lines
content1: |
 Arbitrary free text
 over "multiple lines" stopping
 after indentation changes...  

...

Equivalent JSON

{
 "content1": "Arbitrary free text\nover \"multiple lines\" stopping\nafter indentation changes...  \n"
}

3. Indicateur + avec le bloc littéral Scalar : garder les nouvelles lignes supplémentaires après le bloc

---
# After string we have 2 new lines
plain: |+
 This unquoted scalar
 spans many lines.

...

Equivalent JSON

{
 "plain": "This unquoted scalar\nspans many lines.\n\n\n"
}

4. - indicateur avec le bloc littéral Scalar : - signifie que le saut de ligne à la fin de la chaîne est supprimé.

---
# After string we have 2 new lines
plain: |-
 This unquoted scalar
 spans many lines.

...

Equivalent JSON

{
 "plain": "This unquoted scalar\nspans many lines."
}

5. Bloc plié Scalar(>) :

transforme les nouvelles lignes en espaces, mais supprime les nouvelles lignes supplémentaires après le bloc.

---
folded_newlines: >
 this is really a
 single line of text
 despite appearances

...

Equivalent JSON

{
 "fold_newlines": "this is really a single line of text despite appearances\n"
}

Pour en savoir plus, vous pouvez visiter mon Blog

0 votes

Dans l'exemple n° 4, vouliez-vous utiliser "|-" après les deux points ? De plus, vous pouvez laisser tomber les marqueurs de fin de directive "---" ici, puisque vous ne montrez qu'un seul document. Les marqueurs de fin de document sont utiles pour mettre en évidence les espaces blancs de fin de document. En dehors de cela, il n'y a pas besoin de documents explicites.

0 votes

Merci de le signaler. C'était une faute de frappe. Je l'ai corrigée. J'ai fourni un marqueur de début et de fin pour que chacun puisse voir les nouvelles lignes après la chaîne.

0 votes

Nr.1 est décrit comme un scalaire simple, de style flux, dans la spécification YAML. L'appeler "block-style" est trompeur.

60voto

phs Points 5913

Pour concaténer de longues lignes sans espace blanc utilisez des guillemets doubles et échappez les nouvelles lignes avec des antislashes :

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

(Merci @Tobia)

1 votes

Merci, cela m'a vraiment aidé à définir les volumes Docker sur plusieurs lignes ! Si quelqu'un a le même problème, Voici ma solution pour un analyseur YAML en ligne.

0 votes

Ah enfin. J'essayais d'envelopper de longues clés ssh dans les fichiers yaml Hiera de Puppet sur plusieurs lignes mais j'obtenais toujours des espaces indésirables jusqu'à ce que j'utilise votre réponse. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X