여러 줄에서 문자열을 나누려면 어떻게합니까?


1537

YAML에는 매우 긴 문자열이 있습니다. 이것을 편집기의 80 열 (또는 열) 뷰 내에 유지하고 싶습니다. 그래서 문자열을 끊고 싶습니다. 이것에 대한 문법은 무엇입니까?

즉, 나는 이것을 가지고있다 :

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

그리고 나는 이것을 (또는이 효과에 대해) 갖고 싶습니다.

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

위와 같이 따옴표를 사용하고 싶습니다. 따라서 문자열 내에서 아무것도 벗어날 필요가 없습니다.

답변:


978

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

목록의 값과 동일한 효과를 어떻게 얻을 수 있습니까?
Mikhail

각 줄 바꿈은 공백으로 대체되거나 단순히 제거됩니까?
Steve

2
각 줄 바꿈은 공백 <-으로 대체 되지만 이중 줄 바꿈은 줄 바꿈입니다.
Jean Jordaan

3351

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)을 추가 할 수 있습니다.

> 접힌 스타일 은 문자열 내에서 줄 바꿈 하나를 제거하지만 끝에 줄 바꿈을 추가하고 두 줄 바꿈을 단일 줄로 변환합니다.

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 의 공식 정의는 다음과 같습니다.

스칼라 내용은 모든 줄 바꿈이 중요한 리터럴 스타일 (“|”로 표시)을 사용하여 블록 표기법으로 작성할 수 있습니다. 또는 각 줄 바꿈이 빈 줄이나 더 들여 쓰기 된 줄로 끝나지 않는 한 공백으로 접히는 접힌 스타일 ( ">"로 표시)로 쓸 수도 있습니다.

블록 표시기를 갈망 블록 스타일 ( >-, |-, >+, |+)

블록 쵸핑 인디케이터 문자를 \n\n추가 하여 문자열에서 마지막 새 줄의 처리와 후행 공백 줄 ( )을 제어 할 수 있습니다 .

  • >, |: "clip": 줄 바꿈을 유지하고 후행 빈 줄을 제거하십시오.
  • >-, |-: "스트립": 줄 바꿈을 제거하고 후행 공백 줄을 제거하십시오.
  • >+, |+: "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"개행 문자"( \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에서 개행 전에 백 슬래시를 쓰는 것을 의미합니다 .
Tobia

23
@pepoluan 나는 가능한 모든 조합을 시도하고 공간을 차지 연결을 허용 한 경우에만 발견 : 문자열 주위에 넣어 따옴표와 개행 문자 앞에 백 슬래시 예 : 데이터 : 텍스트 / 일반; base64로, dGVzdDogImZvb1wKICBiYXIiCg == (들여 쓰기를.)
Tobia

42
반대로 @wvxvw, YAML은 많은 일반적인 유스 케이스 (예 : 구성 파일)에서 최악의 형식이라고 생각합니다. 대부분의 사람들은 겉보기 단순성으로 인해 나중에 매우 복잡한 형식이라는 사실을 깨닫기 때문입니다. YAML은 잘못된 것을 올바르게 보이게 합니다. 예를 들어, :문자열 배열의 한 문자열 내 에서 무해한 콜론 은 YAML이이를 객체 배열로 해석합니다. 그것은 가장 놀랍게도 되는 원칙에 위배 됩니다.
Vicky Chijwani

20
누군가이 주제에 관한 웹 사이트를 만들었습니다 : yaml-multiline.info @SteveBennett ㄹ 모르는 경우 해당 페이지의 바닥 글을 확인하십시오.
우동 단

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.

" YAML의 여러 줄에 걸쳐 있는 매우 긴 문장 \ n 이지만 \ n 줄 바꿈이 유지 되는 문자열 \ n으로 표시 됩니다. \ n "


이것은 두 줄로 잘 작동하지만 세 줄로는 잘 작동하지 않는 것 같습니다.
cboettig

고마워, 당신이 말한대로 잘 작동합니다. Pandoc의 YAML 헤더에 어떤 이유로 나는를 반복해야합니다 |: 나에게 분명하지 않은 이유로, 각 라인에 groups.google.com/forum/#!topic/pandoc-discuss/xuqEmhWgf9A
cboettig

1
이 예는 레일 4의 새 줄로 변환되지 않습니다!
Rubytastic

내가 쓴다면 :-field1 : | 하나 둘-field1 : | 내가 얻는 세 가지 : one \ ntwo \ n 및 three \ nfor? 나는 2 이후에 \ n을하지 않을 것이라고 생각합니다 ...
Alain1405

cat구분자와 함께 여러 줄을 사용 하면 선행 공백 (YAML에 필요)이 출력에 추가됩니다.
Karl Richter

109

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

– – 리터럴 블록 스칼라가있는 표시기 : 문자열 끝에 줄 바꿈이 제거되었음을 나타냅니다.

---
# 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를 "|-"로 사용하려고 했습니까? 또한 하나의 문서 만 표시하므로 "---"지시문 끝 마커를 잃을 수 있습니다. 문서 끝 마커는 문서에서 후행 공백을 강조하는 데 도움이됩니다. 그럼에도 불구하고 명시적인 문서는 필요하지 않습니다.
seh

지적 해 주셔서 감사합니다. 그것은 오타였습니다. A는 그것을 고쳤다. 모든 사람이 문자열 다음에 새로운 줄을 볼 수 있도록 시작 및 끝 표시를 제공했습니다.
Arayan Singh

Nr.1은 YAML 사양에서 일반 플로우 스타일 스칼라로 설명됩니다. 그것을 블록 스타일이라고 부르는 것은 오도의 소지가 있습니다.
Anthon

Nr.1을 일반 플로우 스타일 스칼라로 변경합니다.
Arayan Singh

42

믿지 못할 수도 있지만 YAML은 여러 줄 키를 사용할 수도 있습니다.

?
 >
 multi
 line
 key
:
  value

3
설명이 필요합니다 ( "?"란 무엇입니까).
ilyaigpetrov

@ilyaigpetrov는 "멀티 라인"키로 작성된 것과 동일합니다. 보통 당신은 같은 일을 key:value하지만, 키가 새로운 라인을 포함하는 경우 상기 한 바와 같이, 당신은 그것을 할 수 있습니다
goFrendiAsgard

4
이에 대한 실제 사용 사례의 예가 있습니까?
Richard-Degenne

1
@ilyaigpetrov는 ?키 표시기입니다 (매핑 키와 동일). 많은 상황에서 키 :뒤의 (필수) 값 표시기 가 구문 분석을 명확하게 할 때 키 표시기를 생략 할 수 있습니다 . 그러나 그렇지 않습니다. 명시 적으로 키를 표시하려면 이것을 사용해야합니다.
Anthon

42

공백없이 긴 행을 연결하려면 큰 따옴표를 사용하고 백 슬래시로 개행을 이스케이프하십시오.

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

(감사합니다 @Tobia)


덕분에 여러 줄에 걸쳐 Docker 볼륨을 정의 할 수있었습니다. 누군가가 같은 문제가있는 경우, 여기에 온라인 YAML 파서 내 솔루션입니다
마이크 Mitterer

아 마침내. Puppet의 Hiera yaml 파일에서 긴 ssh 키를 여러 줄로 감싸려고했지만 대답을 사용할 때까지 항상 원치 않는 공간이 생겼습니다. 감사.
Martijn Heemels

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에서 한 줄에 적절한 결과를 얻을 수 있습니다.

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 파일에서 효과가 없었습니다. 많은 옵션을 시도한 후에는 HTML 주입 <br>으로도 HTML이 렌더링되므로 HTML 주입도 가능하다는 것을 깨달았습니다 .

이름 : 기억하고 싶지 않은 | La Mancha 마을에서 .<br><br>

적어도 그것은 나를 위해 작동합니다. 이 접근법과 관련된 문제에 대해서는 전혀 모른다.


2
해결책은 다른 문제를 말합니다. 귀하의 경우 YAML 처리 결과 렌더링 된 HTML에 줄 바꿈이 나타나기를 원합니다. HTML과 YAML은 서로 암시 적 관계가 없습니다. 그리고 YAML이 정기적 인 줄 바꿈을 통과하더라도 HTML은이를 무시합니다. 결국 op의 질문은 매우 긴 줄을 막기 위해 YAML 자체에서 줄 바꿈을 사용하는 것과 관련이 있습니다. 결국 데이터가 렌더링되는 방식에 대해서는 신경 쓰지 않습니다. 왜 이렇게 말합니까? 이것은 여기에 제공된 다른 모든 솔루션이 귀하의 경우에 작동하지 않는 이유를 설명하기 때문입니다.
토마스 어반
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.