文字列を複数行に分割するにはどうすればよいですか?


1539

YAMLでは、非常に長い文字列があります。これをエディターの80カラム(またはそう)のビュー内に保持したいので、文字列を分割します。これの構文は何ですか?

言い換えれば、私はこれを持っています:

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

そして私はこれ(またはこの効果に対する何か)が欲しいです:

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

上記のように引用符を使用したいので、文字列内の何もエスケープする必要はありません。

回答:


979

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/を参照してください


ありがとうございます。ただし、この構文を引用符で囲むことはできません。引用符は結果の文字列でリテラルとして表示されます。
jjkparker

どういうわけか、私のアプリで翻訳が終了した直後に改行が追加されます。そうすれば、JavaScriptはそれを複数の行として認識し、失敗します。{{- 'key'|trans -}}どちらも機能しません。
Rvanlaak

リストの値としてこれと同じ効果をどのように得ますか?
ミハイル

各改行はスペースに置き換えられるか、単に削除されますか?
Steve

2
各改行はスペース <-で置き換えられますが、二重改行は改行になります。
Jean Jordaan

3354

YAMLで複数行の文字列を書き込むには、5 6 NINE(またはカウント方法によっては63 *)の異なる方法があります。

TL; DR

  • 通常、あなたは欲しい>

    key: >
      Your long
      string here.
    
  • \n文字列のように改行を保持したい場合は(たとえば、段落付きの埋め込みマークダウン)、を使用します|

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • 末尾に改行を追加したくない場合は>-|-代わりにまたはを使用します。

  • 単語の途中で行を分割する必要がある場合、または文字どおり改行を入力する必要がある場合は、\n代わりに二重引用符を使用します。

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAMLはクレイジーです。

ブロックスカラースタイル(>|

これらは、次のような文字を許可\し、"エスケープせず、そして(新しい行を追加し\n、あなたの文字列の末尾に)。

> 折りたたみスタイルは、文字列内の単一の改行を削除します(ただし、最後に1つ追加し、二重の改行を単一に変換します)。

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| リテラルスタイルは、文字列内のすべての改行をリテラル改行に変換し、最後に1行追加します。

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で」「改行文字」を意味します。「インライン改行」行は文字どおりバックスラッシュと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       |

「スペース」の前の行の末尾のスペースに注意してください。

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

この情報の一部はここにもまとめられています


28
63の構文の中で、改行やスペースを入れてはいけない文字列を複数の行で綴ることができる単一の構文があると思いますか?"..." + "..."ほとんどのプログラミング言語で書かれているように、またはBashの改行の前にバックスラッシュを付けます。
トビア

23
@pepoluan可能なすべての組み合わせを試したところ、スペースなしの連結が可能な組み合わせだけが見つかりました。文字列とバックスラッシュを二重引用符で囲み、改行(およびインデント)の前に配置します。例:data:text / plain; base64、dGVzdDogImZvb1wKICBiYXIiCg ==
Tobia

42
@wvxvw逆に、YAMLは多くの一般的なユースケース(構成ファイルなど)で最悪のフォーマットだと思います。特に、ほとんどの人は、非常に複雑なフォーマットであることを後で理解するためだけにその単純さを理解しているためです。YAMLは間違ったものを正しく見えるようにします。たとえば、:文字列配列内の1つの文字列内の無害なコロンは、YAMLにそれをオブジェクトの配列として解釈させます。それは最小の驚き原則に違反しています。
Vicky Chijwani

20
誰かがこのトピックについてウェブサイトを作成しました:yaml-multiline.info @SteveBennettㄹ知らない場合は、そのページのフッターを確認してください。
うどんだん2018年

38
まだ別の複数行文字列構文
xdhmoore

186

改行を保持するに|は、たとえばを使用します。

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

これは「これは非常に長い文ですis \ n YAMLのいくつかの行にまたがっています‌ \ nしかし、文字列としてレンダリングされます‌ \ n改行が保持されます。\ n "


これは私にとって2行でうまくいくようですが3行ではうまくいきませんか?
cboettig 2013年

ありがとう、あなたが言うように、そこでうまくいきます。Pandocのyamlヘッダーの何らかの理由で|、私には明らかではない理由のために、各行でを繰り返す必要があります:groups.google.com/forum
#!topic

1
この例では、レール4の新しいラインに変換されません!
Rubytastic

私が書いた場合:-field1:|という事実は問題ではありません one two-field1:| 3つは '\ n2つ\ nと3つは\ n?私は2の後に\ nが存在しないようにアスペクトします...
Alain1405

catデリミタ付きの複数行を使用すると、これにより先行スペース(YAMLに必要)が出力に追加されます。
カールリヒター

110

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.リテラルブロックスカラー: リテラルブロックスカラー| 改行と末尾のスペースが含まれます。しかし余分を取り除きます

ブロックの後の改行。

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

詳細については、私のブログにアクセスできます


例4で、コロンの後に「|-」を使用するつもりでしたか?また、1つのドキュメントしか表示していないため、ここで「---」ディレクティブの終了マーカーを失う可能性があります。ドキュメントの終了マーカーは、ドキュメントの末尾の空白を強調するのに役立ちます。それ以外は、明示的なドキュメントは必要ありません。
seh

指摘してくれてありがとう。それはタイプミスでした。Aが修正しました。文字列の後に全員が新しい行を表示できるように、開始マーカーと終了マーカーを用意しました。
Arayan Singh

Nr.1は、YAML仕様でプレーンなフロースタイルのスカラーとして記述されています。ブロックスタイルと呼ぶのは誤解を招くものです。
Anthon、

Nr.1をプレーンなフロースタイルのスカラーに変更します。
アラヤンシン

42

信じられないかもしれませんが、YAMLは複数行のキーも実行できます。

?
 >
 multi
 line
 key
:
  value

3
説明が必要です(「?」とは)。
ilyaigpetrov 2017

@ilyaigpetrovの記述どおりの「複数行」キー。通常は次のようkey:valueにしますが、キーに改行が含まれている場合は、上記のように行うことができます
goFrendiAsgard

4
このための実際のユースケースの例はありますか?
Richard-Degenne、

1
@ilyaigpetrov ?はキーインジケータです(マッピングのキーと同様)。多くの状況では、キーの:後に(必須の)値インジケータが解析を明確にする場合、キーインジケータを省略できます。しかし、そうではありません。これを使用して、明示的にキーをマークする必要があります。
Anthon、

42

空白なしで長い行を連結するには、二重引用符を使用して、バックスラッシュで改行をエスケープします。

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

(@Tobiaに感謝)


おかげで、これは本当にDockerボリュームを複数の行にわたって定義するのに役立ちました!誰かが同じ問題を抱えている場合は、オンラインYAMLパーサーでの私の解決策をここに示します
Mike Mitterer

やっと。PuppetのHiera yamlファイルの長いsshキーを複数行でラップしようとしましたが、あなたの答えを使用するまでは常に不要なスペースがありました。ありがとう。
Martijn Heemels 2017年

18

Symfonyでの翻訳にYAMLとTwigを使用していて、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の1行で複数行の翻訳が行われます。

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

これはバグのようです。バグレポートを提出する機会がありましたか?
dreftymac

8

文字列にスペースが含まれているかどうかに関係なく、二重引用符とバックスラッシュを使用した行の継続を優先します。

key: "String \
  with long c\
  ontent"

ただし、継続行がスペースで始まる場合の落とし穴に注意してください。継続行はエスケープする必要があります(他の場所で削除されるため)。

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

文字列に改行が含まれる場合は、Cスタイルで記述する必要があります\n

この質問も参照してください。


それが剥ぎ取られている場合は別の場所で、つまりはその位置に、あなたはに関する情報をあなたの答え更新することができないところ、それが剥ぎ取られますが。それを行うパーサー(言語)も記述してください。私は唯一のパーサは複数行の引用符文字列で末尾のスペースを/など大手を取り除く見てきたところで
Anthon、

0

Jekyllプロジェクト内のYAMLファイルでは、上記の解決策はどれも私にとってはうまくいきませんでした。多くのオプションを試した後<br>、最終的にすべてがHTMLにレンダリングされるため、HTMLインジェクションも可能であることに気付きました。

名前:名前を覚えたくない| ラマンチャの村。<br><br>

少なくとも私にとってはうまくいきます。このアプローチに関連する問題についてはわかりません。


2
あなたの解決策は別の問題を参照しています:あなたのケースでは、YAMLの処理の結果としてレンダリングされたHTMLに改行を表示したい場合。HTMLとYAMLには、暗黙的な関係はありません。また、YAMLが通常の改行に合格しても、HTMLはそれらを無視します。結局、opの質問は、非常に長い行を防ぐためにYAML自体で改行を使用することに関連しています。最終的にデータがどのようにレンダリングされるかは関係ありません。なぜこれを言うのですか?これは、ここに記載されている他のすべてのソリューションがあなたのケースでは機能しない理由を説明しているからです。
Thomas Urban
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.