Wie breche ich eine Zeichenfolge über mehrere Zeilen?

1539

In YAML habe ich eine Zeichenfolge, die sehr lang ist. Ich möchte dies in der 80-Spalten-Ansicht (oder so) meines Editors belassen, daher möchte ich die Zeichenfolge unterbrechen. Wie lautet die Syntax dafür?

Mit anderen Worten, ich habe Folgendes:

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

und ich möchte dies (oder etwas in diesem Sinne) haben:

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

Ich möchte Anführungszeichen wie oben verwenden, damit ich nichts innerhalb der Zeichenfolge umgehen muss.

jjkparker
quelle

Antworten:

979

Bei Verwendung des gefalteten Yaml-Stils wird jeder Zeilenumbruch durch ein Leerzeichen ersetzt. Die Einrückung in jeder Zeile wird ignoriert. Am Ende wird ein Zeilenumbruch eingefügt.

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

Sie können den "Block Chomping Indicator" verwenden, um den Zeilenumbruch wie folgt zu beseitigen:

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.

Es stehen auch andere Steuerungswerkzeuge zur Verfügung (zum Beispiel zum Steuern der Einrückung).

Siehe https://yaml-multiline.info/

Matt Williamson
quelle
Vielen Dank, aber Sie können diese Syntax anscheinend nicht in Anführungszeichen setzen: Die Anführungszeichen werden in der resultierenden Zeichenfolge als Literale angezeigt.
jjkparker
Irgendwie wird direkt nach dem Ende der Übersetzung in meiner App ein Wagenrücklauf hinzugefügt. Auf diese Weise sieht Javascript es als mehrere Zeilen und schlägt fehl. {{- 'key'|trans -}}geht auch nicht.
Rvanlaak
Wie würden Sie den gleichen Effekt wie ein Wert in einer Liste erzielen?
Mikhail
Jeder Zeilenumbruch wird durch ein Leerzeichen ersetzt oder einfach entfernt?
Steve
2
Jeder Zeilenumbruch wird durch ein Leerzeichen <- ersetzt, ein doppelter Zeilenumbruch ist jedoch ein Zeilenumbruch.
Jean Jordaan
3352

Es gibt 5 6 NEUN (oder 63 *, je nachdem, wie Sie zählen) verschiedene Möglichkeiten, mehrzeilige Zeichenfolgen in YAML zu schreiben.

TL; DR

  • Normalerweise möchten Sie >:

    key: >
      Your long
      string here.
    
  • Wenn Sie möchten, dass die Zeilenumbrüche wie \nin der Zeichenfolge beibehalten werden (z. B. eingebetteter Markdown mit Absätzen), verwenden Sie |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Verwenden Sie >-oder |-stattdessen, wenn am Ende kein Zeilenumbruch angehängt werden soll.

  • Wenn Sie Zeilen in der Mitte von Wörtern teilen oder Zeilenumbrüche buchstäblich als eingeben müssen \n, verwenden Sie stattdessen doppelte Anführungszeichen:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAML ist verrückt.

Block skalare Stile ( >, |)

Diese erlauben Zeichen wie \und "ohne Escapezeichen und fügen \nam Ende Ihrer Zeichenfolge eine neue Zeile ( ) hinzu.

> Der gefaltete Stil entfernt einzelne Zeilenumbrüche innerhalb der Zeichenfolge (fügt jedoch am Ende eine hinzu und konvertiert doppelte Zeilenumbrüche in Singles):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| Der wörtliche Stil verwandelt jede neue Zeile in der Zeichenfolge in eine wörtliche neue Zeile und fügt am Ende eine hinzu:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Hier ist die offizielle Definition aus der YAML-Spezifikation 1.2

Skalare Inhalte können in Blocknotation unter Verwendung eines Literalstils (angezeigt durch "|") geschrieben werden, bei dem alle Zeilenumbrüche von Bedeutung sind. Alternativ können sie mit dem gefalteten Stil (mit „>“ gekennzeichnet) geschrieben werden, wobei jeder Zeilenumbruch zu einem Leerzeichen gefaltet wird, es sei denn, er endet mit einer leeren oder einer stärker eingerückten Zeile.

Block Stile mit Block scharrt Indikator ( >-, |-, >+, |+)

Sie können die Behandlung der letzten neuen Zeile in der Zeichenfolge und aller nachfolgenden Leerzeilen ( \n\n) steuern, indem Sie ein Block-Chomping-Indikatorzeichen hinzufügen :

  • >, |: "clip": Zeilenvorschub beibehalten, nachgestellte Leerzeilen entfernen.
  • >-, |-: "Streifen": Entfernen Sie den Zeilenvorschub, entfernen Sie die nachgestellten Leerzeilen.
  • >+, |+: "behalten": Zeilenvorschub beibehalten, Leerzeilen nachziehen.

"Flow" Skalar Arten ( , ", ')

Diese haben ein begrenztes Escapezeichen und erstellen eine einzeilige Zeichenfolge ohne neue Zeilenzeichen. Sie können in derselben Zeile wie der Schlüssel oder zuerst mit zusätzlichen Zeilenumbrüchen beginnen.

einfacher Stil (kein Entkommen, Nein#oder:Kombinationen, Begrenzung des ersten Zeichens):

Key: this is my very very very 
  long string

Stil in doppelten Anführungszeichen (\und"muss\maskiert werden, Zeilenumbrüche können mit einer Literalfolge eingefügt\nwerden, Zeilen können ohne Leerzeichen mit nachgestelltenZeichenverkettet werden\):

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

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

Stil in einfachen Anführungszeichen (Literal'muss verdoppelt werden, keine Sonderzeichen, möglicherweise nützlich, um Zeichenfolgen auszudrücken, die mit doppelten Anführungszeichen beginnen):

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

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

Zusammenfassung

In dieser Tabelle _bedeutet space character. \nbedeutet "Zeilenumbruch" ( \nin JavaScript), mit Ausnahme der Zeile "Zeilenumbruch", in der es wörtlich einen Backslash und ein n bedeutet.

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

Beispiele

Beachten Sie die nachgestellten Leerzeichen in der Zeile vor "Leerzeichen".

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

Blockstile mit Einrückungsindikatoren

Nur für den Fall, dass Ihnen das oben Genannte nicht ausreicht, können Sie einen " Blockeinrückungsindikator " hinzufügen (nach Ihrem Blockzusammensetzungsindikator, falls vorhanden):

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

Nachtrag

Wenn Sie am Anfang von nicht den ersten Zeilen im gefalteten Stil zusätzliche Leerzeichen einfügen, werden diese mit einem Bonus-Zeilenumbruch beibehalten. Dies ist bei Flow-Stilen nicht der Fall:

- >
    my long
      string
- my long
    string

["my long\n string\n", "my long string"]

Ich kann nicht einmal.

*2 Blockstile mit jeweils 2 möglichen Block-Chomping-Indikatoren (oder keine) und mit 9 möglichen Einrückungsindikatoren (oder keine), 1 einfachen Stil und 2 zitierten Stilen: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Einige dieser Informationen auch zusammengefasst hier .

Steve Bennett
quelle
28
Glauben Sie, dass es unter den 63 Syntaxen eine einzige gibt, mit der Sie eine Zeichenfolge, die keine Zeilenumbrüche oder Leerzeichen enthalten sollte, in mehreren Zeilen buchstabieren können? Ich meine, was man wie "..." + "..."in den meisten Programmiersprachen oder Backslash vor Newline in Bash schreiben würde .
Tobia
23
@pepoluan Ich habe jede mögliche Kombination ausprobiert und nur eine gefunden, die eine raumlose Verkettung ermöglicht: Setzen Sie doppelte Zeichen in Anführungszeichen um die Zeichenfolge und einen Backslash vor Zeilenumbruch (und Einrückung). Beispiel: data: text / plain; base64, dGVzdDogImZvb1wKICBiYXIiCg ==
Tobia
42
@wvxvw im Gegenteil, ich denke, YAML ist das schlechteste Format für viele gängige Anwendungsfälle (z. B. Konfigurationsdateien), nicht zuletzt, weil die meisten Leute von seiner scheinbaren Einfachheit angezogen werden, nur um viel später zu erkennen, dass es sich um ein äußerst komplexes Format handelt. YAML lässt falsche Dinge richtig aussehen - zum Beispiel lässt ein harmloser Doppelpunkt :innerhalb eines Strings in einem String-Array YAML ihn als Array von Objekten interpretieren. Es verstößt gegen das Prinzip des geringsten Erstaunens .
Vicky Chijwani
20
Jemand hat eine Website zu diesem Thema erstellt: yaml-multiline.info @SteveBennett ㄹ Falls Sie dies nicht wussten, überprüfen Sie die Fußzeile dieser Seite.
Udondan
38
Noch eine
mehrzeilige
186

Zur Erhaltung newlines Verwendung |, zum Beispiel:

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

wird übersetzt in "Dies ist ein sehr langer Satz‌ \ n , der mehrere Zeilen in der YAML‌ \ n umfasst, aber als Zeichenfolge‌ \ n mit beibehaltenen Zeilenumbrüchen gerendert wird . \ n "

Ali Shakiba
quelle
Das scheint für mich mit zwei Zeilen gut zu funktionieren, aber nicht mit drei?
Cboettig
Danke, funktioniert dort gut, genau wie du sagst. Aus irgendeinem Grund muss ich in Pandocs Yaml-Headern das |in jeder Zeile wiederholen , aus Gründen, die mir nicht klar sind: groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
cboettig
1
Dieses Beispiel wird NICHT in neue Zeilen in Schienen 4 konvertiert!
Rubytastic
Ist kein Problem die Tatsache, dass wenn ich schreibe: - field1: | eins zwei - Feld1: | drei für 'Ich bekomme: eins \ ntwo \ n und drei \ nfür? Ich würde das \ n nach 2 betrachten, um nicht da zu sein ...
Alain1405
Bei Verwendung von Multiline catmit Trennzeichen werden der Ausgabe führende Leerzeichen (die für YAML erforderlich sind) hinzugefügt.
Karl Richter
109

1. Blocknotation (einfach, im Flow-Stil, skalar): Zeilenumbrüche werden zu Leerzeichen und zusätzlichen Zeilenumbrüchen, nachdem der Block entfernt wurde

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

...

Äquivalentes JSON

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

2. Literaler Blockskalar: Ein wörtlicher Blockskalar | enthält die Zeilenumbrüche und alle nachgestellten Leerzeichen. entfernt aber extra

Zeilenumbrüche nach dem Block.

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


...

Äquivalentes JSON

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

3. + Indikator mit Literal Block Scalar: Halten Sie zusätzliche Zeilenumbrüche nach dem Block

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


...

Äquivalentes JSON

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

4. - Indikator mit Literal Block Scalar: - bedeutet, dass die neue Zeile am Ende der Zeichenfolge entfernt wird.

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


...

Äquivalentes JSON

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

5. Gefalteter Blockskalar (>):

Faltet Zeilenumbrüche in Leerzeichen und entfernt zusätzliche Zeilenumbrüche nach dem Block.

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


...

Äquivalentes JSON

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

Für mehr kannst du meinen Blog besuchen

Arayan Singh
quelle
Wollten Sie zum Beispiel # 4 "| -" nach dem Doppelpunkt verwenden? Außerdem können Sie hier die Endmarkierungen der Direktiven "---" verlieren, da Sie nur ein Dokument anzeigen. Die Dokumentendmarkierungen sind hilfreich, um das nachfolgende Leerzeichen in den Dokumenten hervorzuheben. Abgesehen davon sind jedoch keine expliziten Dokumente erforderlich.
seh
Vielen Dank für den Hinweis. das war ein Tippfehler. A haben das behoben. Ich habe Start- und Endmarker bereitgestellt, damit jeder nach der Zeichenfolge neue Zeilen sehen kann.
Arayan Singh
Nr.1 wird in der YAML-Spezifikation als einfacher Skalar im Flow-Stil beschrieben. Es als Blockstil zu bezeichnen, ist irreführend.
Anthon
Ändert Nr.1 ​​als einfachen Skalar im Flow-Stil.
Arayan Singh
42

Sie werden es vielleicht nicht glauben, aber YAML kann auch mehrzeilige Tasten ausführen:

?
 >
 multi
 line
 key
:
  value
Mohsen
quelle
3
Erklärung erforderlich (was ist "?").
ilyaigpetrov
@ilyaigpetrov genau wie geschrieben, "mehrzeiliger" Schlüssel. Normalerweise machen Sie Dinge wie key:value, aber wenn Ihr Schlüssel eine neue Zeile enthält, können Sie dies wie oben beschrieben tun
goFrendiAsgard
4
Gibt es ein Beispiel für einen realen Anwendungsfall?
Richard-Degenne
1
@ilyaigpetrov das ?ist der Schlüsselindikator (wie im Schlüssel in einem Mapping). In vielen Situationen können Sie den Schlüsselindikator weglassen, wenn der (erforderliche) Wertindikator :nach dem Schlüssel das Parsen eindeutig macht. Dies ist jedoch nicht der Fall. Sie müssen dies verwenden, um den Schlüssel explizit zu markieren.
Anthon
42

Um lange Zeilen ohne Leerzeichen zu verketten , verwenden Sie doppelte Anführungszeichen und schließen Sie die Zeilenumbrüche mit umgekehrten Schrägstrichen:

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

(Danke @Tobia)

phs
quelle
Vielen Dank, dies hat mir wirklich geholfen, Docker-Volumes über mehrere Zeilen zu definieren! Wenn jemand das gleiche Problem hat, hier ist meine Lösung für einen Online-YAML-Parser
Mike Mitterer
Ah endlich. Ich habe versucht, lange SSH-Schlüssel in Puppets Hiera-Yaml-Dateien über mehrere Zeilen zu wickeln, habe aber immer unerwünschte Leerzeichen erhalten, bis ich Ihre Antwort verwendet habe. Vielen Dank.
Martijn Heemels
18

Wenn Sie YAML und Twig für Übersetzungen in Symfony verwenden und mehrzeilige Übersetzungen in Javascript verwenden möchten, wird direkt nach der Übersetzung ein Wagenrücklauf hinzugefügt. Also auch der folgende Code:

var javascriptVariable = "{{- 'key'|trans -}}";

Welches hat die folgende yml Übersetzung:

key: >
    This is a
    multi line 
    translation.

Wird immer noch den folgenden Code in HTML ergeben:

var javascriptVariable = "This is a multi line translation.
";

Das Minuszeichen in Twig löst dies also nicht. Die Lösung besteht darin, dieses Minuszeichen nach dem Größer-als-Zeichen in yml einzufügen:

key: >-
    This is a
    multi line 
    translation.

Wird das richtige Ergebnis haben, mehrzeilige Übersetzung in einer Zeile in Twig:

var javascriptVariable = "This is a multi line translation.";
Rvanlaak
quelle
Das sieht aus wie ein Fehler. Hattest du die Möglichkeit, einen Fehlerbericht einzureichen?
Dreftymac
8

In Situationen, in denen die Zeichenfolge Leerzeichen enthalten könnte oder nicht, bevorzuge ich doppelte Anführungszeichen und Zeilenfortsetzung mit umgekehrten Schrägstrichen:

key: "String \
  with long c\
  ontent"

Beachten Sie jedoch die Gefahr für den Fall, dass eine Fortsetzungslinie mit einem Leerzeichen beginnt und maskiert werden muss (da sie an anderer Stelle entfernt wird):

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

Wenn die Zeichenfolge Zeilenumbrüche enthält, muss diese im C-Stil geschrieben werden \n.

Siehe auch diese Frage .

Joe
quelle
Wenn es an anderer Stelle entfernt wird , dh nicht an dieser Position, können Sie Ihre Antwort mit Informationen darüber aktualisieren, wo es entfernt wird. Bitte schreiben Sie auch, welcher Parser (für welche Sprache) das macht? Ich habe nur Parser gesehen, die solche führenden / nachfolgenden Leerzeichen in mehrzeiligen Anführungszeichen entfernt haben .
Anthon
0

Keine der oben genannten Lösungen hat für mich in einer YAML-Datei innerhalb eines Jekyll-Projekts funktioniert. Nachdem ich viele Optionen ausprobiert hatte, wurde mir klar, dass eine HTML-Injection mit <br>auch funktionieren könnte, da am Ende alles in HTML gerendert wird:

Name: | In einem Dorf von La Mancha, an <br>dessen Namen ich mich nicht <br>erinnern möchte.

Zumindest funktioniert es bei mir. Keine Ahnung zu den mit diesem Ansatz verbundenen Problemen.

Irene
quelle
2
Ihre Lösung bezieht sich auf ein anderes Problem: In Ihrem Fall möchten Sie, dass Zeilenumbrüche in gerendertem HTML als Ergebnis der Verarbeitung von YAML angezeigt werden. HTML und YAML haben keine implizite Beziehung zueinander. Und selbst wenn YAML reguläre Zeilenumbrüche passieren würde, würde HTML sie ignorieren. Schließlich bezieht sich die Frage der Operation auf die Verwendung von Zeilenumbrüchen in YAML selbst, nur um sehr lange Zeilen zu verhindern. Es ist egal, wie die Daten am Ende gerendert werden könnten. Warum das erzählen? Denn dies erklärt, warum alle anderen hier angegebenen Lösungen in Ihrem Fall nicht funktionieren.
Thomas Urban