Làm thế nào để tôi phá vỡ một chuỗi trên nhiều dòng?


1539

Trong YAML, tôi có một chuỗi rất dài. Tôi muốn giữ điều này trong chế độ xem 80 cột (hoặc hơn) của trình soạn thảo của mình, vì vậy tôi muốn phá vỡ chuỗi. Cú pháp cho việc này là gì?

Nói cách khác, tôi có điều này:

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

và tôi muốn có cái này (hoặc cái gì đó cho hiệu ứng này):

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

Tôi muốn sử dụng dấu ngoặc kép như trên, vì vậy tôi không cần phải thoát bất cứ điều gì trong chuỗi.

Câu trả lời:


979

Sử dụng kiểu gấp yaml, mỗi ngắt dòng được thay thế bằng khoảng trắng. Sự chỉ định trong mỗi dòng sẽ bị bỏ qua. Một ngắt dòng sẽ được chèn vào cuối.

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/civerse/components/yaml/yaml_format.html

Bạn có thể sử dụng "chỉ báo chặn khối" để loại bỏ ngắt dòng, như sau:

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.

Cũng có các công cụ kiểm soát khác (ví dụ để kiểm soát thụt đầu dòng).

Xem https://yaml-multiline.info/


Cảm ơn, nhưng bạn không thể gói cú pháp này trong dấu ngoặc kép, có vẻ như: các trích dẫn xuất hiện dưới dạng chữ trong chuỗi kết quả.
jjkparker

Bằng cách nào đó, một sự trở lại vận chuyển được thêm vào ngay sau khi kết thúc bản dịch trong ứng dụng của tôi. Bằng cách đó, Javascript thấy nó là nhiều dòng và thất bại. {{- 'key'|trans -}}cũng không hoạt động.
Rvanlaak

Làm thế nào bạn sẽ có được hiệu ứng tương tự như một giá trị trong danh sách?
Mikhail

mỗi ngắt dòng được thay thế bằng một khoảng trắng hoặc đơn giản là loại bỏ?
Steve

2
mỗi ngắt dòng được thay thế bằng dấu cách <- nhưng ngắt dòng đôi sẽ là ngắt dòng.
Jean Jordaan

3353

5 6 NINE (hoặc 63 *, tùy thuộc vào cách bạn đếm) các cách khác nhau để viết chuỗi nhiều dòng trong YAML.

TL; DR

  • Thông thường, bạn muốn >:

    key: >
      Your long
      string here.
    
  • Nếu bạn muốn ngắt dòng được bảo toàn như \ntrong chuỗi (ví dụ: đánh dấu nhúng với các đoạn văn), hãy sử dụng |.

    key: |
      ### Heading
    
      * Bullet
      * Points
    
  • Sử dụng >-hoặc |-thay vào đó nếu bạn không muốn ngắt dòng được nối vào cuối.

  • Nếu bạn cần phân chia các dòng ở giữa các từ hoặc gõ theo dòng theo nghĩa đen \n, hãy sử dụng dấu ngoặc kép thay thế:

    key: "Antidisestab\
     lishmentarianism.\n\nGet on it."
    
  • YAML thật điên rồ.

Khối kiểu vô hướng ( >, |)

Những thứ này cho phép các ký tự như \"không thoát, và thêm một dòng mới ( \n) vào cuối chuỗi của bạn.

> Kiểu gấp sẽ loại bỏ các dòng mới trong chuỗi (nhưng thêm một dòng ở cuối và chuyển đổi hai dòng mới thành số đơn):

Key: >
  this is my very very very
  long string

this is my very very very long string\n

| Kiểu chữ biến mọi dòng mới trong chuỗi thành một dòng mới theo nghĩa đen và thêm một dòng ở cuối:

Key: |
  this is my very very very 
  long string

this is my very very very\nlong string\n

Đây là định nghĩa chính thức từ YAML Spec 1.2

Nội dung vô hướng có thể được viết theo ký hiệu khối, sử dụng kiểu chữ (được biểu thị bởi dòng | |) trong đó tất cả các ngắt dòng đều có ý nghĩa. Ngoài ra, chúng có thể được viết với kiểu gấp (được biểu thị bằng cách>>) trong đó mỗi ngắt dòng được gấp lại thành một khoảng trắng trừ khi kết thúc một dòng trống hoặc một dòng thụt vào nhiều hơn.

Khối phong cách với khối chỉ nhai ( >-, |-, >+, |+)

Bạn có thể kiểm soát việc xử lý dòng mới cuối cùng trong chuỗi và bất kỳ dòng trống nào ( \n\n) bằng cách thêm một ký tự chỉ báo khối chomping khối :

  • >, |: "clip": giữ nguồn cấp dữ liệu, xóa các dòng trống ở cuối.
  • >-, |-: "dải": xóa nguồn cấp dữ liệu, xóa các dòng trống ở cuối.
  • >+, |+: "keep": giữ nguồn cấp dữ liệu, tiếp tục theo dõi các dòng trống.

"Flow" phong cách vô hướng ( , ", ')

Chúng có giới hạn thoát và xây dựng một chuỗi đơn không có ký tự dòng mới. Chúng có thể bắt đầu trên cùng một dòng với khóa hoặc với các dòng mới bổ sung trước.

kiểu đơn giản (không thoát, không#hoặc:kết hợp, giới hạn ở ký tự đầu tiên):

Key: this is my very very very 
  long string

kiểu trích dẫn kép (\"phải được thoát theo\, các dòng mới có thể được chèn bằng một chuỗi theo nghĩa đen\n, các dòng có thể được nối mà không có khoảng trắng với dấu\):

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

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

kiểu trích dẫn đơn (nghĩa đen'phải được nhân đôi, không có ký tự đặc biệt, có thể hữu ích để thể hiện chuỗi bắt đầu bằng dấu ngoặc kép):

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

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

Tóm lược

Trong bảng này, _có nghĩa là space character. \ncó nghĩa là "ký tự dòng mới" ( \ntrong JavaScript), ngoại trừ hàng "dòng mới trong dòng", trong đó có nghĩa đen là dấu gạch chéo ngược và 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       |

Ví dụ

Lưu ý các dấu cách trên dòng trước "khoảng trắng".

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

Kiểu khối với các chỉ số thụt

Chỉ trong trường hợp ở trên không đủ cho bạn, bạn có thể thêm " chỉ báo thụt khối " (sau chỉ báo nhai khối của bạn, nếu bạn có):

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

Phụ lục

Nếu bạn chèn thêm khoảng trắng ở đầu các dòng không phải đầu tiên theo kiểu Folded, chúng sẽ được giữ lại, với một dòng mới thưởng. Điều này không xảy ra với các kiểu dòng chảy:

- >
    my long
      string
- my long
    string

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

Tôi thậm chí không thể.

*2 kiểu khối, mỗi kiểu có 2 chỉ số nhai khối có thể (hoặc không có) và với 9 chỉ báo thụt đầu dòng có thể (hoặc không có), 1 kiểu đơn giản và 2 kiểu được trích dẫn: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63

Một số thông tin này cũng đã được tóm tắt ở đây .


28
Trong số 63 cú pháp, bạn có nghĩ có một cú pháp duy nhất cho phép bạn đánh vần trong nhiều dòng một chuỗi không nên có dòng mới cũng như khoảng trắng không? Ý tôi là những gì người ta sẽ viết như "..." + "..."trong hầu hết các ngôn ngữ lập trình, hoặc dấu gạch chéo ngược trước dòng mới trong Bash.
Tobia

23
@pepoluan Tôi đã thử mọi sự kết hợp có thể và chỉ tìm thấy một cho phép nối không bờ bến: đặt dấu ngoặc kép quanh chuỗi và một dấu chéo ngược trước khi xuống dòng Ví dụ: Dữ liệu: text / plain; base64, dGVzdDogImZvb1wKICBiYXIiCg == (và thụt đầu dòng.)
Tobia

42
@wvxvw thì ngược lại, tôi nghĩ YAML là định dạng tồi tệ nhất đối với nhiều trường hợp sử dụng phổ biến (ví dụ: tệp cấu hình), nhất là vì hầu hết mọi người bị thu hút bởi sự đơn giản rõ ràng của nó chỉ để nhận ra sau đó là định dạng cực kỳ phức tạp. YAML làm cho những điều sai có vẻ đúng - ví dụ, một dấu hai chấm vô hại :trong một chuỗi trong một chuỗi chuỗi làm cho YAML diễn giải nó như là một mảng của các đối tượng. Nó vi phạm nguyên tắc ít ngạc nhiên nhất .
Vicky Chijwani

20
Ai đó đã tạo một trang web về chủ đề này: yaml-multiline.info @SteveBennett Trong trường hợp bạn không biết, hãy kiểm tra chân trang của trang đó.
udondan

38
Một cú pháp chuỗi nhiều dòng khác
xdhmoore

186

Để duy trì sử dụng dòng mới| , ví dụ:

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

được dịch thành "Đây là một câu rất dài‌ \ n kéo dài một vài dòng trong YAML‌ \ n nhưng sẽ được hiển thị dưới dạng một chuỗi‌ \ n với các dòng mới được bảo tồn. \ n "


Điều này dường như làm việc tốt với tôi với hai dòng nhưng không phải với ba?
cboettig

Cảm ơn, hoạt động tốt ở đó giống như bạn nói. Vì một số lý do trong các tiêu đề yaml của Pandoc, tôi cần lặp lại |trên mỗi dòng, vì những lý do không rõ ràng đối với tôi: Groups.google.com.vn/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
cboettig

1
Ví dụ này KHÔNG chuyển đổi sang các dòng mới trong rails 4!
Rubytastic

Không phải là một vấn đề thực tế là nếu tôi viết: - field1: | một hai - trường1: | ba cho 'Tôi nhận được: một \ ntwo \ n và ba \ nfor? Tôi sẽ khía cạnh \ n sau 2 để không ở đó ...
Alain1405

Khi sử dụng multiline catvới dấu phân cách, điều này làm cho các khoảng trắng hàng đầu (cần thiết cho YAML) được thêm vào đầu ra.
Karl Richter

110

1. Ký hiệu khối (đơn giản, kiểu dòng chảy, vô hướng): Dòng mới trở thành khoảng trắng và dòng mới bổ sung sau khi khối bị xóa

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

...

JSON tương đương

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

2. Vô hướng khối vô nghĩa: Một khối vô hướng theo nghĩa đen |sẽ bao gồm các dòng mới và bất kỳ dấu cách. nhưng loại bỏ thêm

dòng mới sau khối.

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


...

JSON tương đương

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

3. + chỉ báo với vô hướng khối chữ: giữ thêm dòng mới sau khối

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


...

JSON tương đương

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

4. - chỉ báo với vô hướng khối vô nghĩa : - có nghĩa là dòng mới ở cuối chuỗi bị xóa.

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


...

JSON tương đương

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

5. Vô hướng khối gấp (>):

sẽ gấp các dòng mới vào khoảng trắng và loại bỏ các dòng mới bổ sung sau khối.

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


...

JSON tương đương

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

để biết thêm bạn có thể truy cập Blog của tôi


Bạn có dự định ví dụ # 4 để sử dụng "| -" sau dấu hai chấm không? Ngoài ra, bạn có thể mất các dấu kết thúc chỉ thị "---" tại đây, vì bạn chỉ hiển thị một tài liệu. Các dấu kết thúc tài liệu rất hữu ích để làm nổi bật khoảng trắng ở cuối tài liệu. Ngoài ra, mặc dù vậy, không cần tài liệu rõ ràng.
seh

cảm ơn đã chỉ ra đó là một lỗi đánh máy A đã sửa nó. Tôi đã cung cấp điểm đánh dấu bắt đầu và kết thúc để mọi người có thể thấy các dòng mới sau chuỗi.
Arayan Singh

Nr.1 được mô tả dưới dạng đơn giản, kiểu dòng chảy, vô hướng trong đặc tả YAML. Gọi nó là phong cách khối là sai lệch.
Anthon

Thay đổi Nr.1 ​​dưới dạng đơn giản, kiểu dòng chảy, vô hướng.
Araya Singh

42

Bạn có thể không tin, nhưng YAML cũng có thể thực hiện các khóa đa dòng:

?
 >
 multi
 line
 key
:
  value

3
Giải thích cần thiết ("là gì?").
ilyaigpetrov

@ilyaigpetrov chính xác như văn bản, khóa "nhiều dòng". Thông thường bạn làm những việc như thế key:value, nhưng nếu khóa của bạn chứa dòng mới, bạn có thể làm như mô tả ở trên
goFrendiAsgard

4
Bất kỳ ví dụ về trường hợp sử dụng trong thế giới thực cho điều này?
Richard-Degenne

1
@ilyaigpetrov ?là chỉ số chính (như trong khóa trong ánh xạ). Trong nhiều tình huống, bạn có thể bỏ qua chỉ báo khóa, khi chỉ báo giá trị (bắt buộc) :sau khóa làm cho việc phân tích cú pháp không rõ ràng. Nhưng đó không phải là trường hợp, bạn sẽ phải sử dụng điều này để đánh dấu khóa rõ ràng.
Anthon

42

Để nối các dòng dài không có khoảng trắng , hãy sử dụng dấu ngoặc kép và thoát các dòng mới bằng dấu gạch chéo ngược:

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

(Cảm ơn @Tobia)


Cảm ơn, điều này thực sự giúp tôi xác định khối lượng Docker qua nhiều dòng! Nếu ai đó có cùng một vấn đề, đây là giải pháp của tôi trên Trình phân tích YAML trực tuyến
Mike Mitterer

Cuối cùng cũng được. Tôi đã cố gắng bọc các phím ssh dài trong các tệp Hiera yaml của Puppet qua nhiều dòng nhưng luôn có khoảng trắng không mong muốn cho đến khi tôi sử dụng câu trả lời của bạn. Cảm ơn.
Martijn Heemels

18

Trong trường hợp bạn đang sử dụng YAML và Twig cho các bản dịch trong Symfony và muốn sử dụng các bản dịch nhiều dòng trong Javascript, một bản hoàn trả vận chuyển sẽ được thêm ngay sau khi dịch. Vì vậy, ngay cả các mã sau đây:

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

Trong đó có bản dịch yml sau:

key: >
    This is a
    multi line 
    translation.

Vẫn sẽ dẫn đến mã sau đây trong html:

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

Vì vậy, dấu trừ trong Twig không giải quyết được điều này. Giải pháp là thêm dấu trừ này sau dấu lớn hơn yml:

key: >-
    This is a
    multi line 
    translation.

Sẽ có kết quả phù hợp, dịch nhiều dòng trên một dòng trong Twig:

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

Điều này trông giống như một lỗi. Bạn đã có cơ hội để báo cáo lỗi?
dreftymac

8

Đối với các tình huống là chuỗi có thể chứa dấu cách hay không, tôi thích dấu ngoặc kép và tiếp tục dòng với dấu gạch chéo ngược:

key: "String \
  with long c\
  ontent"

Nhưng lưu ý về cạm bẫy cho trường hợp một dòng tiếp tục bắt đầu bằng một khoảng trắng, nó cần phải được thoát (vì nó sẽ bị tước đi ở nơi khác):

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

Nếu chuỗi chứa ngắt dòng, điều này cần phải được viết bằng C phong cách \n.

Xem thêm câu hỏi này .


Nếu nó bị tước đi ở nơi khác , tức là không ở vị trí đó, bạn có thể cập nhật câu trả lời của mình với thông tin về nơi nó sẽ bị tước đi. Xin vui lòng viết trình phân tích cú pháp (cho ngôn ngữ nào) không? Tôi chỉ thấy các trình phân tích cú pháp loại bỏ các khoảng trắng hàng đầu / dấu như vậy trong các chuỗi trích dẫn đa dòng tại chỗ .
Anthon

0

Không có giải pháp nào ở trên làm việc cho tôi, trong tệp YAML trong dự án Jekyll. Sau khi thử nhiều tùy chọn, tôi nhận ra rằng việc tiêm HTML cũng có <br>thể làm được, vì cuối cùng mọi thứ đều được kết xuất thành HTML:

Tên: | Trong một ngôi làng La Mancha <br>có tên tôi không<br> muốn nhớ.

Ít nhất nó làm việc cho tôi. Không có ý tưởng về các vấn đề liên quan đến phương pháp này.


2
Giải pháp của bạn đề cập đến một vấn đề khác: trong trường hợp của bạn, bạn muốn các ngắt dòng xuất hiện trong HTML được kết xuất do xử lý YAML. HTML và YAML không có mối quan hệ ngầm với nhau. Và ngay cả khi YAML sẽ vượt qua các bản ngắt dòng thông thường, HTML sẽ bỏ qua chúng. Cuối cùng, câu hỏi của op có liên quan đến việc sử dụng các ngắt dòng trong chính YAML chỉ để ngăn chặn các dòng rất dài. Nó không quan tâm đến việc làm thế nào dữ liệu có thể được hiển thị cuối cùng. Tại sao nói điều này? Bởi vì điều này giải thích tại sao tất cả các giải pháp khác được đưa ra ở đây không hoạt động trong trường hợp của bạn.
Thomas Urban
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.