Bir dizeyi birden çok satıra nasıl bölerim?


1538

YAML'de çok uzun bir dizem var. Bunu düzenleyicimin 80 sütunlu (ya da öylesine) görünümünde tutmak istiyorum, bu yüzden dizeyi kırmak istiyorum. Bunun sözdizimi nedir?

Başka bir deyişle, bu var:

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

ve ben (ya da bu etki için bir şey) istiyorum:

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

Yukarıdaki gibi tırnak kullanmak istiyorum, bu yüzden dize içinde bir şey kaçmak gerekmez.

Yanıtlar:


979

Yaml katlanmış stil kullanıldığında, her satır sonu bir boşlukla değiştirilir. Her satırdaki girinti göz ardı edilir. Sonuna bir satır sonu eklenir.

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

Aşağıdaki satır sonunu ortadan kaldırmak için "blok parçalama göstergesini" kullanabilirsiniz:

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.

Başka kontrol araçları da mevcuttur (örneğin girintiyi kontrol etmek için).

Bkz. Https://yaml-multiline.info/


Teşekkürler, ancak bu sözdizimini tırnak içine alamazsınız, tırnak işaretleri ortaya çıkan dizede değişmez olarak görünür.
jjkparker

Uygulamamda çevirinin bitiminden hemen sonra bir şekilde bir satır başı eklendi. Bu şekilde Javascript bunu birden çok satır olarak görür ve başarısız olur. {{- 'key'|trans -}}de çalışmıyor.
Rvanlaak

Listedeki bir değerle aynı etkiyi nasıl elde edersiniz?
Mikhail

her satır sonu bir boşlukla değiştirilir mi yoksa basitçe kaldırılır mı?
Steve

2
her satır kesmesi bir boşluk < ile değiştirilir - ancak çift satır sonu bir satır sonu olur.
Jean Jordaan

3351

YAML'de çok satırlı dizeler yazmak için 5 6 NINE (veya nasıl saydığınıza bağlı olarak 63 *) vardır.

TL; DR

  • Genellikle, istediğiniz >:

    key: >
      Your long
      string here.
    
  • Çizgi satırlarının \ndizede olduğu gibi korunmasını istiyorsanız (örneğin, paragraflarla gömülü işaretleme) kullanın |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Sonuna bir satır sonu eklenmesini istemiyorsanız >-veya |-bunun yerine kullanın .

  • Kelimelerin ortasındaki satırları bölmeniz veya tam anlamıyla satır satırlarını şu şekilde yazmanız gerekiyorsa \n, bunun yerine çift tırnak kullanın:

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

Skaler stilleri engelle ( >,| )

Bunlar , kaçış gibi \ve "kaçmadan karakterlere izin verir ve \ndizenizin sonuna yeni bir satır ( ) ekler .

> Katlanmış stil , dize içindeki tek yeni satırları kaldırır (ancak sonuna bir satır ekler ve çift yeni satırı tekli olarak dönüştürür):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| Değişmez stil , dizedeki her yeni satırı değişmez bir satıra dönüştürür ve sonuna bir satır ekler:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

İşte YAML Spec 1.2'nin resmi tanımı

Skaler içerik, tüm satır sonlarının önemli olduğu değişmez bir stil (“|” ile gösterilir) kullanılarak blok gösteriminde yazılabilir. Alternatif olarak, boş veya daha girintili bir çizgiyi bitirmedikçe, her satır kesmesinin bir boşluğa katlandığı katlanmış stille (“>” ile gösterilir) yazılabilir.

Blok (göstergeyi chomping ile Blok stilleri >-, |-, >+,|+ )

\n\nBir blok parçalama gösterge karakteri ekleyerek dizedeki son yeni satırın ve sondaki boş satırların ( ) işlenmesini denetleyebilirsiniz :

  • >, | : "clip": satır beslemesini koru, boş satırları kaldır.
  • >-, |- : "strip": satır beslemesini kaldır, boş satırları kaldır.
  • >+, |+: "keep": satır beslemesini koruyun, boş satırları takip edin.

"Akış" sayıl stilleri ( , ",' )

Bunlar sınırlı kaçışa sahiptir ve yeni satır karakteri olmayan tek satırlık bir dize oluşturur. Anahtarla aynı satırda veya önce ek satırlarla başlayabilirler.

düz stil (kaçış yok,kombinasyonyok#veya:kombinasyon, ilk karakterde sınırlar):

Key: this is my very very very 
  long string

çift ​​tırnaklı stil (\ve"kaçınılması gereken\, yeni satırlar değişmez bir\ndiziile eklenebilir, satırlar boşluklu boşluklar olmadan birleştirilebilir\):

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

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

tek tırnaklı stil (değişmez'değer iki katına çıkarılmalıdır, çift tırnak işareti ile başlayan dizeleri ifade etmek için yararlı olabilecek özel karakterler olmamalıdır):

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

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

özet

Bu tabloda, _anlamına gelir space character. \n"satır içi \nyeni satırlar" satırı hariç, "satırsonu yeni satır" hariç, "satırsonu karakteri" anlamına gelir.

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

Örnekler

"Boşluklardan" önceki satırdaki boşluklara dikkat edin.

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

Girinti göstergeli blok stilleri

Yukarıdakilerin sizin için yeterli olmaması durumunda, bir " blok girintisi göstergesi " ekleyebilirsiniz (eğer varsa blok kesme göstergenizden sonra):

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

ek

Katlanmış stilde ilk olmayan satırların başına fazladan boşluk eklerseniz, bunlar bonus satırsonu ile korunur. Akış stillerinde bu olmaz:

- >
    my long
      string
- my long
    string

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

Ben bile yapamam.

*Her biri 2 olası blok kesme göstergesine (veya hiçbirine) ve 9 olası girinti göstergesine (veya hiçbirine) sahip 2 blok stili, 1 düz stil ve 2 alıntı stili: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Bu bilgilerin bir kısmı burada da özetlenmiştir .


28
63 sözdizimi arasında, yeni satırlar veya boşluklar olmaması gereken bir dizeyi birden çok satırda yazmanıza izin veren tek bir tane olduğunu düşünüyor musunuz? "..." + "..."Çoğu programlama dilinde olduğu gibi ne yazacağını veya Bash'teki yeni satırdan önce ters eğik çizgi yazacağımı kastediyorum .
Tobia

23
@pepoluan Mümkün olan her kombinasyonu denedim ve boşluksuz birleştirme için yalnızca bir tane buldum: dizenin etrafına çift tırnak ve satırsonu (ve girintiden önce) ters eğik çizgi koydu Örnek: data: text / plain; base64, dGVzdDogImZvb1wKICBiYXIiCg ==
Tobia

42
@wvxvw tersine, YAML, çoğu insanın sadece son derece karmaşık bir format olduğunu daha sonra fark etmek için görünen basitliği ile çekildiği için, çoğu yaygın kullanım örneği (örneğin, yapılandırma dosyaları) için en kötü format olduğunu düşünüyorum. YAML yanlış şeylerin doğru görünmesini sağlar - örneğin, bir :dize dizisindeki bir dize içindeki zararsız bir kolon , YAML'yi bir nesne dizisi olarak yorumlar. En az şaşkınlık ilkesini ihlal ediyor .
Vicky Chijwani

20
Birisi bu konu hakkında bir web sitesi hazırladı: yaml-multiline.info @SteveBennett ㄹ Farkında değilseniz, o sayfanın altbilgisini kontrol edin.
udondan

38
Yet Another Multi Line string sözdizimi
xdhmoore

186

Yeni satırları korumak |için şunu kullanın :

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

"Bu, YAML‌'da birkaç satıra yayılan çok uzun bir cümle‌ \ n \ n, ancak yeni satırlar korunarak bir dize olarak gösterilecek \ \ n . \ n "


Bu benim için iki çizgi ile iyi çalışıyor gibi görünüyor, ama üç ile değil?
cboettig

Teşekkürler, aynen dediğin gibi iyi çalışıyor. Pandoc'un yaml başlıklarında bir |nedenden dolayı, benim için açık olmayan nedenlerle, her satırı tekrarlamam gerekiyor : groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
cboettig

1
Bu örnek, raylar 4'teki yeni hatlara dönüşmez!
Rubytastic

Bir sorun değil ki ben yazmak eğer: - field1: | bir iki - field1: | 'Ben: bir \ ntwo \ n ve üç \ nfor? Ben orada olmamak için 2 sonra \ n yönü ...
Alain1405

catSınırlayıcı ile çok satırlı kullanıldığında , bu çıkışa önde gelen boşlukların (YAML için gerekli olan) eklenmesine neden olur.
Karl Richter

109

1. Blok Gösterimi (düz, akış tarzı, skaler): Yeni satırlar, blok kaldırıldıktan sonra boşluk olur ve ekstra yeni satırlar olur

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

...

Eşdeğer JSON

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

2. Değişmez Blok Skaler: Değişmez Blok Skaler |yeni satırları ve sondaki boşlukları içerecektir. ama fazladan çıkarır

bloktan sonra yeni satırlar.

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


...

Eşdeğer JSON

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

3. Değişmez Blok Skaler ile + göstergesi: bloktan sonra ekstra satır sonu tutmak

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


...

Eşdeğer JSON

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

4. - Değişmez Blok Skaler göstergesi: - dizenin sonundaki satırsonu kaldırılır.

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


...

Eşdeğer JSON

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

5. Katlanmış Blok Skaler (>):

yeni satırları boşluklara katlar ve bloktan sonra fazladan yeni satırları kaldırır.

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


...

Eşdeğer JSON

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

Benim ziyaret edebilirsiniz fazlası için Blog


Örneğin # 4'ü iki nokta üst üste işaretinden sonra "| -" kullanmayı mı amaçladınız? Ayrıca, yalnızca bir belge gösterdiğiniz için burada "---" yönergelerinin son işaretlerini kaybedebilirsiniz. Belge sonu işaretçileri, belgelerdeki arka boşluğu vurgulamak için yararlıdır. Bunun dışında açık belgelere gerek yok.
seh

işaret ettiğiniz için teşekkürler. bu bir yazım hatasıydı. Bunu düzelttim. Herkesin dizeden sonra yeni satırlar görebilmesi için başlangıç ​​ve bitiş işaretçisini sağladım.
Arayan Singh

No. 1, YAML spesifikasyonunda düz, akış tarzı, skaler olarak tanımlanır. Blok tarzı olarak adlandırmak yanıltıcıdır.
Anthon

No.1'i düz, akış tarzı, skaler olarak değiştirir.
Arayan Singh

42

Buna inanmayabilirsiniz, ancak YAML çok satırlı tuşları da yapabilir:

?
 >
 multi
 line
 key
:
  value

3
Açıklama gerekli ("?" Nedir).
ilyaigpetrov

@ilyaigpetrov aynen yazıldığı gibi, "çok satırlı" anahtar. Genellikle böyle şeyler yaparsınız key:value, ancak anahtarınız yeni satır içeriyorsa, yukarıda açıklandığı gibi yapabilirsiniz
goFrendiAsgard

4
Bunun için gerçek dünya kullanım örneği var mı?
Richard-Degenne

1
@ilyaigpetrov ?anahtar göstergedir (bir eşlemedeki anahtarda olduğu gibi). Çoğu durumda, tuştan sonraki (gerekli) değer göstergesi :ayrışmayı kesinleştirdiğinde , anahtar göstergesini dışarıda bırakabilirsiniz . Ancak durum böyle değil, anahtarı açıkça işaretlemek için bunu kullanmanız gerekecek.
Anthon

42

Boşluk olmadan uzun satırları birleştirmek için çift tırnak işareti kullanın ve yeni satırlardan ters eğik çizgilerden kaçın:

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

(Teşekkürler @Tobia)


Teşekkürler, bu gerçekten Docker ciltlerini birden fazla satır üzerinden tanımlamama yardımcı oldu! Birisi aynı soruna sahipse, bir Online YAML Parser
Mike Mitterer'daki

Ah sonunda. Puppet'in Hiera yaml dosyalarında uzun ssh tuşlarını birden çok satır üzerinde sarmaya çalışıyordum, ancak cevabınızı kullanana kadar her zaman istenmeyen alanlar aldım. Teşekkürler.
Martijn Heemels

18

Symfony'daki çeviriler için YAML ve Twig kullanıyorsanız ve Javascript'te çok satırlı çeviriler kullanmak istiyorsanız, çeviriden hemen sonra bir satır başı eklenir. Yani aşağıdaki kod bile:

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

Aşağıdaki yml çevirisine sahiptir:

key: >
    This is a
    multi line 
    translation.

Hala html'de şu kodla sonuçlanacaktır:

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

Yani, Twig'deki eksi işareti bunu çözmez. Çözüm, bu eksi işaretini yml'den büyük olandan sonra eklemektir:

key: >-
    This is a
    multi line 
    translation.

Twig'de bir satırda doğru sonuç, çok satırlı çeviri olacak:

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

Bu bir hata gibi görünüyor. Hata raporu verme şansınız oldu mu?
dreftymac

8

Dize boşluk içerip içermediği durumlar için, çift tırnak işaretlerini ve ters eğik çizgilerle satır devam etmeyi tercih ederim:

key: "String \
  with long c\
  ontent"

Ancak, bir devam çizgisinin bir boşlukla başladığı durumunun tuzağına dikkat edin, kaçması gerekir (çünkü başka bir yerde soyulur):

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

Dize satır sonu içeriyorsa, bunun C stilinde yazılması gerekir \n .

Ayrıca bu soruya bakın .


Başka bir yerde çıkarılırsa , yani bu konumda değilse, cevabınızı nerede çıkarılacağı hakkında bilgilerle güncelleyebilirsiniz . Lütfen hangi ayrıştırıcıyı (hangi dil için) yaptığını da yazın? Ben sadece ayrıştırıcılar yerinde çok satırlı tırnaklar dizeleri gibi önde gelen / sondaki boşluk şerit gördük .
Anthon

0

Yukarıdaki çözümlerin hiçbiri benim için Jekyll projesi içindeki bir YAML dosyasında işe yaramadı. Birçok seçeneği denedikten sonra, bir HTML enjeksiyonunun <br>da yapabileceğini fark ettim , çünkü sonunda her şey HTML'ye işlendi:

Adı: Adını hatırlamak istemediğim | La Mancha köyünde .<br><br>

En azından benim için çalışıyor. Bu yaklaşımla ilgili problemler hakkında hiçbir fikrim yok.


2
Çözümünüz farklı bir soruna işaret ediyor: sizin durumunuzda, YAML'nin işlenmesi sonucunda satır satırlarının işlenmiş HTML'de görünmesini istiyorsunuz. HTML ve YAML'nin birbirleriyle örtük bir ilişkisi yoktur. Ve YAML düzenli satır aralıklarını geçse bile HTML bunları yok sayar. Sonunda op'un sorusu, sadece çok uzun çizgileri önlemek için YAML'nin kendisinde çizgi çizgileri kullanmakla ilgilidir. Sonunda verilerin nasıl oluşturulacağı umurumda değil. Neden bunu söylüyorsun? Çünkü bu, burada verilen diğer tüm çözümlerin sizin durumunuzda neden çalışmadığını açıklıyor.
Thomas Urban
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.