2012-10-14 23 views
14

Nếu tôi sử dụng dấu nháy đơn, lời nói với dấu nháy ("không") là gây phiền nhiễu để thoát:Do zsh hoặc bash có báo giá thuận tiện cho văn bản tiếng Anh?

'Don'"'"'t do that' 

Nếu tôi sử dụng dấu ngoặc kép, dấu hiệu đồng đô la và dấu chấm than chuyến đi nó lên:

"It cost like \$1000\!" 

Có loại trích dẫn nào khác mà tôi có thể sử dụng không?

chỉnh sửa: Tôi cũng nên thêm rằng tôi muốn chuyển chuỗi này trực tiếp dưới dạng đối số dòng lệnh, thay vì lưu trữ nó trong một biến. Để kết thúc này tôi đã cố gắng, sử dụng giải pháp DigitalRoss của,

$ echo "$(cat << \EOF 
Don't $worry be "happy". 
EOF)" 

nhưng nhận

dquote cmdsubst> 

sau khi chạm vào: /. Vì vậy, tại thời điểm này, đề nghị của ZyX là setopt rcquotes có vẻ là tiện lợi nhất.

+0

'EOF' cuối cùng cần phải nằm trên một dòng, không có ký tự nào khác. Đặt dấu ngoặc đơn gần trên dòng tiếp theo. –

+0

@glennjackman Tôi nhận được kết quả tương tự. – Owen

+0

Hmm, trình bao đang chờ báo giá đơn lẻ được khớp. –

Trả lời

19

Với zsh bạn có thể làm

setopt rcquotes 

. Sau đó, các dấu nháy đơn ASCII được thoát như sau:

echo 'Don''t' 

. Hoặc thiết lập sơ đồ bàn phím của bạn để có thể nhập dấu nháy UTF, họ không có vấn đề với bất kỳ loại dấu ngoặc kép (bao gồm cả không có) trong bất kỳ shell:

echo 'Don’t' 

. Công việc thứ ba cho cả zsh và bash:

echo $'Don\'t' 

.

Không phải thứ nhất cũng như thứ ba có thể thu hẹp báo giá thành một ký tự đơn, nhưng chúng vẫn ít chi tiết hơn đối với các chuỗi không dài, sau đó heredocs đề xuất ở trên. Với zsh, bạn có thể thực hiện việc này bằng cách sử dụng tiện ích con chấp nhận tùy chỉnh sẽ thay thế các cấu trúc như 'Don't' bằng 'Don'\''t'. Yêu cầu ma thuật regex khá phức tạp mà tôi có thể viết chỉ trong perl; và có lẽ không phải là ý tưởng hay nhất vì tôi không thể giả vờ rằng tôi có thể bao gồm tất cả các trường hợp có thể xảy ra trước khi chúng xảy ra. Nó sẽ không trong bất kỳ trường hợp nào chạm vào bất kỳ tập lệnh nào.

3

Nếu bạn muốn gán một văn bản trích dẫn cho một biến, bạn vẫn có thể sử dụng heredocs, giống như (và nó có thể là một văn bản có nhiều dòng quá):

read -r -d '' VAR <<'ENDOFVAR' 
This "will be" a 'really well' escaped text. Or won't. 
ENDOFVAR 
+0

Cảm ơn, đã chỉnh sửa –

4

Tôi thích hướng Zsolt Botykai đang xảy ra. Đây là một ví dụ làm việc với bất kỳ shell Posix nào. (Tôi cũng đã xác minh rằng nó đã tồn tại sau khi dán vào máy chủ SO.)

$ read -r x << \EOF 
Don't $worry be "happy". 
EOF 
$ echo $x 
Don't $worry be "happy". 

Những việc làm cho công việc này;

  • -r sẽ làm cho \ không kỳ diệu
  • các \EOF thay vì chỉ EOF làm $ không kỳ diệu
+0

Lưu ý rằng trừ khi bạn xóa chúng khỏi '$ IFS', các khoảng trống đầu và cuối sẽ bị xóa. Ngoài ra, nó chỉ hoạt động cho văn bản một dòng. –

+0

Tôi tin rằng nếu bạn trích dẫn duy nhất ''EOF'', nó có tác dụng đơn trích dẫn toàn bộ văn bản:' read -r x <<' EOF'' –

Các vấn đề liên quan