2011-11-03 35 views
27

Sau đây là hoạt động như mong đợi. Tôi muốn thay thế từ "tôi" với \'Thoát báo giá đơn lẻ

echo "test ' this" | sed 's/'"'"'/me/g' 
test me this 

Kết quả mong đợi:

test \' this 

Có thể thoát khỏi dấu ngoặc kép cũng trong cùng một lệnh?

Trả lời

45

Câu hỏi của bạn hơi khó hiểu vì không có me trong chuỗi gốc để thay thế. Tuy nhiên, tôi nghĩ rằng tôi có nó. Hãy để tôi diễn giải:

Tôi có một lệnh sed mà có thể thay thế thành công một dấu nháy đơn ' với từ me. Tôi muốn một cái tương tự có thể thay thế bằng chuỗi ký tự \'.

Nếu đó là trường hợp (bạn chỉ muốn thoát khỏi dấu ngoặc đơn), bạn có thể sử dụng:

pax$ echo "test ' this" | sed "s/'/\\\'/g" 
test \' this 

Bằng cách sử dụng dấu ngoặc kép quanh lệnh sed, bạn loại bỏ sự cần thiết phải lo lắng về dấu nháy đơn nhúng . Bạn làm phải sau đó lo lắng về việc thoát từ vỏ sẽ hấp thụ một mức độ thoát để sed sẽ thấy:

s/'/\'/g 

mà sẽ chuyển đổi ' vào \' như mong muốn.

Nếu bạn muốn có một cách để thoát khỏi cả hai đơn dấu ngoặc kép với một đơn sed, có lẽ đơn giản nhất để cung cấp nhiều lệnh để sed vì vậy bạn có thể sử dụng dấu ngoặc kép thay thế:

pax$ echo "Single '" 'and double "' 
Single ' and double " 

pax$ echo "Single '" 'and double "' | sed -e "s/'/\\\'/g" -e 's/"/\\"/g' 
Single \' and double \" 

Nếu tôi đã hiểu lầm các yêu cầu của bạn, một vài ví dụ có thể giúp bạn.

+0

Tôi nghĩ rằng anh ấy có nghĩa là một sự thay thế tiếp theo cho lần chuyển đổi đầu tiên của anh ấy. '[dod @ MBP-13 ~] echo" kiểm tra tôi cái này "| sed "s/me/\\\ '/" ' ' test \' this' –

+0

@Dawn, thực ra tôi nghĩ điều đó có ý nghĩa. OP biết làm thế nào để làm điều đó để có được 'me', họ bây giờ muốn làm điều đó để có được' \ ''(và cho dấu ngoặc kép cũng). Cập nhật (hy vọng) trả lời điều đó. – paxdiablo

+0

Cảm ơn bạn đã đề cập đến bạn có thể thay thế dấu nháy đơn bên ngoài thành dấu ngoặc kép, làm việc tuyệt vời cho tôi:) –

6

Đây có phải là những gì bạn có nghĩa ?:

# cat <<! | sed 's/["'"'"']/\\&/g' 
> quote ' 
> double quotes " 
> quote ' double quotes " 
> ! 
quote \' 
double quotes \" 
quote \' double quotes \" 

Hoặc này:

# echo "test me test"|sed 's/me/\\'"'"'/g' 
test \' test 
# echo "test me test"|sed 's/me/\\"/g' 
test \" test 

tôi thấy nó tốt nhất để luôn luôn trích dẫn đơn sed/awk/perl ... lệnh trên dòng lệnh và làm cho "lỗ" cho các thông số trích dẫn kép được sử dụng trong đó.

9

Tôi có một số nghi ngờ về câu hỏi của bạn, nhưng dù sao có lẽ giải pháp của tôi hữu ích cho bất kỳ ai.

Hãy để tôi nói trước tất cả:

\\ đó là trung bình một \ bởi vì khi bạn đặt hai cùng bạn đang hủy ý nghĩa của nó như metacharater. Và \ x27 dưới dạng trích dẫn đơn, ít nhất là đối với tôi dễ hơn làm việc với một đôi ...

Cuối cùng tôi đưa

echo "test me this" | sed 's/me/\\\x27/g' 

vì vậy đây bạn có kiểm tra tôi ==> test \' này

echo "test \' this" | sed 's/\\\x27/me/g' 

và đây là điều ngược lại.

+0

Tôi sẽ không bao giờ tự mình tìm ra điều này. Cảm ơn rất nhiều! –

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