Mehrzeilige Strings in YAML: | und > richtig verwenden
Für mehrzeilige Texte (YAML multiline string) nutzt du in YAML einen Blockstring: | (literal) behält jeden Zeilenumbruch, > (folded) macht aus einzelnen Zeilenumbrüchen Leerzeichen. Danach folgt der Text eingerückt in den nächsten Zeilen. Ob am Ende ein Zeilenumbruch steht, steuerst du mit - und + (|-, |+, >-, >+).
Was am Ende wirklich im String steht, siehst du am schnellsten im JSON. Füge dein YAML in den YAML-zu-JSON-Konverter ein: Dort ist jeder Zeilenumbruch als \n sichtbar. Alle Beispiele unten kannst du so nachprüfen. Die Konvertierung läuft lokal im Browser, es wird nichts an einen Server gesendet.
Literal-Block mit |
text: |
Zeile eins
Zeile zwei
{ "text": "Zeile eins\nZeile zwei\n" }
Jeder Zeilenumbruch bleibt erhalten, auch der letzte. Die gemeinsame Einrückung der Zeilen gehört nicht zum Text. Zusätzliche Leerzeichen darüber hinaus bleiben dagegen erhalten, ebenso Leerzeilen:
text: |
a
b
{ "text": "a\n\nb\n" }
Folded-Block mit >
text: >
Das ist ein langer Satz,
der im Editor auf
mehrere Zeilen verteilt ist.
{ "text": "Das ist ein langer Satz, der im Editor auf mehrere Zeilen verteilt ist.\n" }
Einzelne Zeilenumbrüche werden zu einem Leerzeichen. Eine Leerzeile bleibt als Zeilenumbruch erhalten, so trennst du Absätze. Zeilen, die stärker eingerückt sind als der Rest, werden nicht gefaltet:
text: >
a
b
c
d
e
{ "text": "a b\nc\n d\ne\n" }
Typischer Einsatz: lange Beschreibungstexte, die im Editor nicht über den Bildschirmrand laufen sollen.
Chomping: Zeilenumbruch am Ende steuern
Der Indikator hinter | oder > legt fest, was mit den Zeilenumbrüchen am Ende des Blocks passiert:
| Schreibweise | Bedeutung | Ergebnis (Text a, b) |
|---|---|---|
| bzw. > (clip) |
genau ein Zeilenumbruch am Ende | "a\nb\n" bzw. "a b\n" |
|- bzw. >- (strip) |
kein Zeilenumbruch am Ende | "a\nb" bzw. "a b" |
|+ bzw. >+ (keep) |
alle Zeilenumbrüche am Ende bleiben | "a\nb\n" plus alle Leerzeilen danach |
Mit |- bekommst du einen sauberen String ohne Anhängsel:
text: |-
a
b
{ "text": "a\nb" }
Mit |+ bleiben auch Leerzeilen am Ende erhalten:
text: |+
a
b
andere: 1
{ "text": "a\nb\n\n\n", "andere": 1 }
Bei >- und >+ gilt dasselbe wie bei |- und |+, nur dass der Text im Inneren gefaltet wird:
a: >-
eins
zwei
b: >+
eins
zwei
c: 1
{ "a": "eins zwei", "b": "eins zwei\n\n", "c": 1 }
Faustregel: | oder > reichen meist. - nimmst du, wenn der Wert ohne abschließenden Zeilenumbruch verglichen oder zusammengesetzt wird. + brauchst du selten.
Einrückungs-Indikator: |2
Normalerweise bestimmt die erste nicht leere Zeile die Einrückung des Blocks. Beginnt der Text selbst mit Leerzeichen, wäre das mehrdeutig. Dann gibst du die Einrückung als Zahl an (1–9), relativ zur Einrückung des übergeordneten Schlüssels:
text: |2
a
b
{ "text": " a\nb\n" }
Hier ist die Einrückung auf 2 festgelegt. Die erste Zeile hat vier Leerzeichen, davon gehören zwei zum Text. Kombinieren kannst du beides: |2- oder |-2 sind gleichwertig.
Mehrzeilige Strings in Anführungszeichen
Auch ohne Block darf ein String über mehrere Zeilen laufen. Das gilt für einfache, doppelte und sogar ungequotete Werte (Plain Scalars). In allen drei Fällen wird ein einzelner Zeilenumbruch zu einem Leerzeichen und eine Leerzeile zu einem Zeilenumbruch:
plain: a
b
c
einfach: 'a
b
c'
doppelt: "a
b
c"
{ "plain": "a b\nc", "einfach": "a b\nc", "doppelt": "a b\nc" }
Nur in doppelten Anführungszeichen kannst du außerdem Escape-Sequenzen nutzen. \n ist ein echter Zeilenumbruch, und ein \ am Zeilenende unterdrückt den Umbruch samt Leerzeichen:
text: "Zeile eins\nZeile zwei"
{ "text": "Zeile eins\nZeile zwei" }
Für längere Texte sind Blockstrings meist lesbarer. In einfachen Anführungszeichen ist \n dagegen kein Escape, sondern bleibt als Backslash und n stehen.
Typische Anwendungen
Skripte in GitHub Actions. Mit run: | läuft jede Zeile als eigener Befehl im selben Shell-Skript:
steps:
- name: Bauen
run: |
npm ci
npm run build
{
"steps": [
{ "name": "Bauen", "run": "npm ci\nnpm run build\n" }
]
}
Willst du einen sehr langen einzelnen Befehl umbrechen, passt run: >- besser: Aus den Zeilen wird ein einzeiliger Befehl ohne Zeilenumbruch am Ende.
Zertifikate und Schlüssel. PEM-Blöcke bestehen aus festen Zeilen und brauchen deshalb |:
cert: |
-----BEGIN CERTIFICATE-----
MIIB...
-----END CERTIFICATE-----
Mit > würden die Zeilen zu einer verklebt, und das Zertifikat wäre ungültig.
SQL und Konfigurationstexte.
query: |
SELECT id, name
FROM users
WHERE aktiv = true;
Hier hilft |, weil Kommentare im SQL (-- ...) nur bis zum Zeilenende gelten. Würdest du > verwenden, würde ein solcher Kommentar den Rest der Abfrage verschlucken.
Häufige Fehler
Falsche oder fehlende Einrückung. Der Block-Inhalt muss tiefer eingerückt sein als der Schlüssel:
text: |
zeile
Das ist ungültig oder ergibt einen leeren String. Richtig:
text: |
zeile
Tabs. YAML erlaubt keine Tabs zur Einrückung. Nutze Leerzeichen.
Weniger eingerückte Zeile mitten im Block. Sie beendet den Block. Der Rest wird dann als neuer Schlüssel gelesen und führt zu einem Fehler. Mehr zu den Meldungen steht im Ratgeber YAML-Fehler.
Leerzeichen am Zeilenende. Sie bleiben im String erhalten und sind im Editor unsichtbar. Im JSON siehst du sie sofort vor dem \n.
Zeilenumbruch am Ende vergessen einzukalkulieren. | und > hängen immer einen \n an. Das stört bei Vergleichen, Dateinamen oder Hashes. Dann nimm |- oder >-.
Kommentare im Block. Ein # innerhalb eines Blockstrings ist Text, kein Kommentar. Ein Kommentar ist nur in der Kopfzeile erlaubt (text: | # Hinweis).
Mit dem YAML-Formatierer rückst du ein YAML-Dokument einheitlich ein und behältst dabei die Kommentare.
Kurz gesagt
|behält alle Zeilenumbrüche,>macht aus einzelnen Umbrüchen Leerzeichen. Leerzeilen trennen Absätze.- Standardmäßig endet der String mit genau einem
\n.-entfernt ihn,+behält alle. - Bei Text, der selbst mit Leerzeichen beginnt, hilft der Einrückungs-Indikator, zum Beispiel
|2. - Für Skripte, Zertifikate und SQL nimmst du
|.>ist für Fließtext. - Prüfe das Ergebnis im YAML-zu-JSON-Konverter: Dort siehst du jeden Zeilenumbruch als
\n.
Weiterlesen: Was ist YAML?, JSON vs. YAML, YAML-Fehler, YAML-Norway-Problem.