web-dev-qa-db-ja.com

YAMLで、どうやって複数の行にまたがって文字列を分割するのですか?

YAMLでは、非常に長い文字列があります。私はこれを私のエディタの80桁(またはそれ以上)のビュー内に保ちたいので、文字列を壊したいのです。この構文は何ですか?

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

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

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

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

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

1223
jjkparker

YAMLの折り畳みスタイルを使用すると、各改行はスペースに置き換えられます。各行のインデントは無視されます。最後に改行が挿入されます。

>
  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

次のように、 "block chomping indicator"を使用して、末尾の改行をなくすことができます。

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

722
Matt Williamson

がある 56 NINE(またはカウント方法に応じて63 *)複数行の文字列をYAMLで書くためのさまざまな方法。

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

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

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

これは YAML Spec 1.2 からの公式の定義です。

スカラの内容は、すべての改行が重要であるリテラルスタイル(「|」で示される)を使用して、ブロック表記で書くことができます。あるいは、空行またはよりインデントのある行で終わらない限り、各改行がスペースに折り返される折り返しスタイル( ">"で表記)で書くこともできます。

ブロックchompingインジケーター付きブロックスタイル(>-|->+|+

ブロックchompingインディケータ 文字を追加することによって、文字列の最後の新しい行、および後続の空白行(\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は「改行文字」を意味します(JavaScriptでは\n)。ただし、「インライン改行」行は文字通りバックスラッシュと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

補遺

Foldedスタイルの先頭行以外の行の先頭に余分なスペースを挿入した場合、それらはボーナス改行で保持されます。これはフロースタイルでは起こりません。

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

この情報のいくつかはまた要約されています ここ

2797
Steve Bennett

newlinesを保持するには|を使用します。例:

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

「これは非常に長い文ですtranslated \ n YAMLの複数の行にまたがる‌ \ nですが、文字列としてレンダリングされます‌ \ n改行を保存してください。\ n "

178
Ali Shakiba

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.リテラルブロックスカラ: Aリテラルブロックスカラ | は改行と後続のスペースを含みます。しかし余分な物を取り除く

ブロックの後の改行.

---
# 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. + Literal Block Scalar付きの+インジケータ: ブロック後に余分な改行を付けます

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

もっとあなたが私の ブログ を訪問することができます

69
Arayan Singh

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

?
 >
 multi
 line
 key
:
  value
39
Mohsen

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

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

(ありがとう@Tobia)

35
phs

Symfonyの翻訳にymlと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.";
16
Rvanlaak

文字列にスペースが含まれる場合と含まれない場合がある場合は、二重引用符とバックスラッシュ付きの行継続を使用します。

key: "String \
  with long c\
  ontent"

しかし、継続行がスペースで始まっている場合の落とし穴について注意してください。

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

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

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

8
Joe

Jekyllプロジェクト内のYAMLファイルでは、上記の解決策はどれも私にとってはうまくいきませんでした。多くのオプションを試した後、<br>を使ったHTMLインジェクションでもうまくいくことがわかりました。

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

少なくともそれは私のために働く。このアプローチに関連した問題についての見当もつかない。

0
Irene