Lệnh thoát một chuỗi trong bash


99

Tôi cần một lệnh bash sẽ chuyển đổi một chuỗi thành một thứ gì đó được thoát. Đây là một ví dụ:

echo "hello\world" | escape | someprog

Nơi lệnh thoát được đưa "hello\world"vào "hello\\\world". Sau đó, someprog có thể sử dụng "hello\\world"như nó mong đợi. Tất nhiên, đây là một ví dụ đơn giản về những gì tôi thực sự sẽ làm.


5
Bản chất của cuộc vượt ngục là gì? Nói cách khác, những ký tự nào cần được thoát? Bạn đang tìm kiếm một lối thoát kiểu C ++ (trong đó các tab được thay thế bằng \ t, dòng mới bằng \ n, dấu ngoặc kép bằng \ ", v.v.)? Thật khó để trợ giúp nếu không xác định rõ vấn đề.
Michael Aaron Safyan

2
bản sao có thể xảy ra của tiếng vọng mà shell-thoát đối số
P Shved

Câu hỏi này có thể có nghĩa là bất kỳ điều gì trong số hàng tá điều khác nhau. Thay vì bắt chúng tôi phải đoán, sẽ hữu ích nếu bạn nói chính xác loại thoát mà bạn đang tìm kiếm.
Don Hatch

1
Câu hỏi dành riêng cho việc sử dụng \\ for \. Có một câu trả lời được chấp nhận.
User1

Câu trả lời:


155

Trong Bash:

printf "%q" "hello\world" | someprog

ví dụ:

printf "%q" "hello\world"
hello\\world

Điều này cũng có thể được sử dụng thông qua các biến:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
Tâm trí bạn, %qđã bị phá vỡ trong hơn một thập kỷ cho đến khoảng năm 2012. Nó có vấn đề với ~. Ngoài ra còn có di sed một lớp lót stackoverflow.com/a/20053121/1073695
Jo Vì vậy,

1
sed thực sự tốt hơn vì cũng có thể thoát khỏi các ký hiệu đô la
2016

2
@untore: a='abc$def":'; printf '%q\n' "$a"kết quả là abc\$def\":(ký hiệu đô la bị thoát). Đây là Bash 4.3 (Tôi nhận được kết quả tương tự trong Bash 3.2). Phiên bản nào bạn đang sử dụng?
Tạm dừng cho đến khi có thông báo mới.

3
để thoát khỏi ký hiệu đô la, chỉ cần sử dụng các dấu ngoặc kép thay thế, ví dụ:printf "%q" 'he$l&lo\world'
LeandroCR Ngày

bash's printf '%q\n' texttrích dẫn văn bản theo bashđịnh dạng (và cho ngôn ngữ hiện tại), vì vậy điều đó sẽ chỉ hoạt động trong trường hợp của OP nếu chúng someprogcó cùng một cú pháp trích dẫn chính xác như bashvậy là rất khó xảy ra.
Stephane Chazelas

9

Pure Bash, sử dụng thay thế tham số:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
theo cách này, "hello world" không được thoát thành "hello \ world" - printf aproach trong câu trả lời được chấp nhận thực hiện điều đó.
vchrizz

1
Ngoài ra, "% q" không thoát khỏi '/' như trong "03/25/2017" mà tôi cần phải thoát sang "03 \ / 25 \ / 2017" (để nó có thể nằm trong dấu thường được phân tách bằng '/' biểu hiện).
wrlee

0

Bạn có thể sử dụng perl để thay thế các ký tự khác nhau, ví dụ:

$ echo "Hello\ world" | perl -pe 's/\\/\\\\/g'
Hello\\ world

Tùy thuộc vào bản chất của cuộc chạy trốn của bạn, bạn có thể chuỗi nhiều cuộc gọi để thoát khỏi các ký tự thích hợp.


1
Tại sao không sed? $ echo "hello \ world" | sed 's / \\ / \\\\ /'
Không gian

1
@Octopus, đó cũng là một lựa chọn hợp lệ. Tôi cảm thấy thoải mái hơn với perl, nhưng vâng, điều đó cũng hiệu quả.
Michael Aaron Safyan
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.