Cách thoát ký tự chỉ báo (ví dụ: hoặc -) trong YAML


241

Trong tệp cấu hình, tôi có một khóa mà tôi muốn gán URL. Vấn đề là YAML diễn giải: và - các ký tự khi tạo ánh xạ hoặc danh sách, do đó, nó có vấn đề với dòng

url: http://www.example-site.com/

(cả vì dấu hai chấm sau http và dấu gạch nối ở giữa)

Có cách nào rõ ràng để thoát ':' và '-' không? Hoặc nó sẽ hoạt động để chỉ đặt toàn bộ trong dấu ngoặc đơn và gọi nó là một ngày?


Câu trả lời:


232

Trích dẫn:

"url: http://www.example-site.com/"

Để làm rõ, tôi có nghĩa là trích dẫn giá trị của người Bỉ và ban đầu nghĩ rằng toàn bộ điều này là giá trị. Nếu http://www.example-site.com/là giá trị, chỉ cần trích dẫn nó như vậy:

url: "http://www.example-site.com/"

30
Nó phụ thuộc vào trình phân tích cú pháp, rõ ràng. Điều này đã không làm việc với Jekyll YAML.
ptomato

1
YAMLDotNet cũng ám chỉ trích dẫn.
Dr1Ku

Không có gì tốt hơn? Bởi vì sau đó các trích dẫn cần phải tự thoát ra, điều đó không giải quyết được vấn đề mà chỉ đơn giản là đưa nó về phía trước ...
Augustin Riedinger

2
Chà, sẽ tuyệt hơn nhiều khi có một tài liệu chống lỗi, giống như đánh dấu, vì vậy những người không chuyên về công nghệ có thể chỉnh sửa nó (ví dụ: các tệp cục bộ trong Rails) mà không có nguy cơ phá vỡ nó!
Augustin Riedinger

1
@ivan_pozdeev: Các trích dẫn đi xung quanh toàn bộ chuỗi. - 'PS4="+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }"'
Ry-

182

Những gì cũng hoạt động và thậm chí còn đẹp hơn đối với các văn bản dài, nhiều dòng, đang đặt văn bản của bạn thụt vào dòng tiếp theo, sau một đường ống hoặc lớn hơn dấu hiệu:

text: >
    Op dit plein stond het hoofdkantoor van de NIROM: Nederlands Indische 
    Radio Omroep

Một đường ống bảo tồn các dòng mới, một dấu hiệu gt biến tất cả các dòng sau thành một chuỗi dài.


6
... Và một dòng mới được thêm vào cuối, thường không phải là những gì bạn muốn.
Equaeghe

51
@equaeghe: Bạn có thể sử dụng >-hoặc |-để ngăn chặn điều này.
dtoux

4
Đây là một giải pháp tuyệt vời. Hoàn toàn tránh phải thoát khỏi các ký tự khác trong văn bản của bạn. +++ 90000 điểm
bennlich

Có thể có một danh sách đa dòng bằng cách nào đó? Tôi đã thử - >nhưng các mục sau lần đầu tiên bị bỏ qua.
ffghfgh

3
@ffghfgh - giục! Tôi không thể tìm ra cách định dạng mã đúng trong bình luận và bây giờ tôi không thể chỉnh sửa nhận xét ban đầu. Về cơ bản, tôi đã sử dụng một mục danh sách với một đường ống, như thế này: - |và sau đó trên một dòng mới, tôi thụt lề văn bản mục danh sách để ký tự đầu tiên xếp thành hàng với đường ống. Tôi hy vọng điều đó có ích, nó hoạt động với tôi trong tệp ngôn ngữ Rails 4.2.
Spakman

51

Theo thông số kỹ thuật YAML, không phải :cũng không -phải là vấn đề. :chỉ là một dấu tách chính có khoảng trắng ở sau nó và -chỉ là một chỉ báo mảng ở đầu một dòng có khoảng trắng ở sau nó.

Nhưng nếu việc triển khai YAML của bạn có vấn đề với nó, bạn có thể có nhiều tùy chọn:

- url: 'http://www.example-site.com/'
- url: "http://www.example-site.com/"
- url:
    http://www.example-site.com/
- url: >-
    http://www.example-site.com/
- url: |-
    http://www.example-site.com/

Tuy nhiên, rõ ràng không có hình thức thoát nào có thể xảy ra trong " phong cách đơn giản ".


1
Kẻ nói dối của travisCI phàn nàn về dấu hai chấm bất thường - lint.travis-ci.org
koppor

Đối với Travis CI, có vẻ như dấu hai chấm trong dấu ngoặc đơn là OK.
Malvineous

30

Báo giá, nhưng tôi thích chúng trên giá trị:

url: "http://www.example.com/"

Đặt chúng trên toàn bộ dòng có vẻ như nó có thể gây ra vấn đề.


21

Một cách khác hoạt động với trình phân tích cú pháp YAML được sử dụng trong Jekyll:

title: My Life: A Memoir

Mặt khác, các dấu hai chấm không theo dấu cách dường như không làm phiền trình phân tích cú pháp YAML của Jekyll. Không làm dấu gạch ngang.


Các tổ chức nhân vật là một phần của YAML? Và những gì Jekyll sử dụng thực sự YAML?
Ry-

Jekyll tuyên bố sẽ sử dụng nó: jekyllrb.com/docs/frontmatter Tôi không thể tìm thấy bất cứ điều gì về các thực thể nhân vật trong thông số YAML, vì vậy tôi nghi ngờ Jekyll là người bất thường, nhưng tôi nghĩ câu trả lời này phục vụ tốt cho những người Googling tôi ;-)
ptomato

4

Nếu bạn đang sử dụng @ConfigurationPropertiesvới Spring Boot 2 để chèn bản đồ bằng các phím chứa dấu hai chấm thì bạn cần thêm một mức thoát bằng dấu ngoặc vuông bên trong dấu ngoặc kép vì mùa xuân chỉ cho phép các ký tự chữ và số, '- tước bỏ phần còn lại. Khóa mới của bạn sẽ trông như thế này:

"[8.11.32.120:8000]": GoogleMapsKeyforThisDomain

Xem này vấn đề github để tham khảo.


Đây là hữu ích nhất trong trường hợp sử dụng hiện tại của tôi. Cảm ơn
anand

2

Tôi đến đây để cố gắng làm cho nhiệm vụ Dòng lệnh Azure DevOps của tôi hoạt động. Điều làm việc cho tôi là sử dụng |ký tự pipe ( ). Sử dụng >không hoạt động.

Thí dụ:

steps:
- task: CmdLine@2
  inputs:
    script: |
      echo "Selecting Mono version..."
      /bin/bash -c "sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1"
      echo "Selecting Xcode version..."
      /bin/bash -c "echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'/Applications/Xcode_10.2.1.app;sudo xcode-select --switch /Applications/Xcode_10.2.1.app/Contents/Developer"

Tôi đã sử dụng điều tương tự .gitlab-ci.yml, nhưng cho đến khi tôi cần ống '|' trong kịch bản - nó thất bại âm thầm trên nó :(
Dalibor
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.