Làm thế nào để thoát khỏi báo giá duy nhất trong sed?


92

Làm thế nào để thoát khỏi một trích dẫn duy nhất trong một biểu thức sed đã được bao quanh bởi dấu ngoặc kép?

Ví dụ:

sed 's/ones/one's/' <<< 'ones thing'


1
Câu trả lời ngắn gọn là " bạn không thể làm điều đó " - các cách giải quyết được trình bày đều hoạt động tốt.
glenn Jackman

Câu trả lời:


149

Trích dẫn sedmã với dấu ngoặc kép:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

Tôi không thích mã thoát với hàng trăm dấu gạch chéo ngược - làm tôi đau mắt. Thông thường tôi làm theo cách này:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
Điều này dường như không hiệu quả với sed -ibất kỳ lý do cụ thể nào?
SamAko

Cần lưu ý rằng xung quanh các lệnh sed có dấu ngoặc kép cho phép các lệnh đó được nội suy bởi shell và có thể dẫn đến các vấn đề không lường trước được.
potong

38

Một mẹo là sử dụng nối chuỗi shell của các chuỗi liền kề và thoát khỏi dấu ngoặc kép được nhúng bằng cách sử dụng shell Escape:

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

Có 3 chuỗi trong biểu thức sed, sau đó shell sẽ ghép lại với nhau:

sed 's/ones/two'

\'

's/'

Hy vọng rằng sẽ giúp ai đó khác!


có lẽ một phiên bản dễ dàng hơn: sed 's / người / hai' là /' <<< 'những điều'
Gregory

@gregory: sed 's/ones/two''s/' <<< 'ones thing'Không, đầu ra đó twos thing. Nó thiếu 'đầu ra. Bạn phải làm theo cách được mô tả trong câu trả lời này.
khôn ngoan

@wisbucky Với phiên bản sed mà tôi đang sử dụng (FreeBSD / macOS) trên zsh, nó chắc chắn xuất ra "điều của hai."
gregory

người đàn ông giúp đỡ tuyệt vời bằng cách cho tôi biết, vỏ sau đó khâu lại với nhau.
Prateek Gupta

6

Cách tốt nhất là sử dụng $'some string with \' quotes \''

ví dụ:

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C-style $'string'là dành riêng cho Bash, vì vậy nó không thể di động với POSIX shell.
tripleee

Nó không bashcụ thể. Nó cũng có sẵn trong kshzsh, nhưng có, nó là một phần mở rộng cho POSIX, điều này rất tốt nếu bạn không viết một script di động. Nhược điểm duy nhất là bạn phải thoát khỏi bất kỳ dấu gạch chéo ngược nào khác mà bạn sử dụng.
dannyw

6

Chỉ cần sử dụng dấu ngoặc kép ở bên ngoài lệnh sed.

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

Nó cũng hoạt động với các tệp.

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

Nếu bạn có dấu nháy đơn dấu ngoặc kép bên trong chuỗi, điều đó cũng ổn. Chỉ cần thoát khỏi dấu ngoặc kép.

Ví dụ, tệp này chứa một chuỗi có cả dấu nháy đơn và dấu nháy kép. Tôi sẽ sử dụng sed để thêm một trích dẫn đơn và xóa một số dấu ngoặc kép.

$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing

Cảm ơn! Tôi yêu regex, yêu sed và bây giờ tôi yêu bạn <3
Gabriel A. Zorrilla

3

Đây là loại ngớ ngẩn nhưng tôi không thể có được \'sed 's/ones/one\'s/'lại làm việc. Tôi đang tìm kiếm điều này để tạo một tập lệnh shell sẽ tự động thêm import 'hammerjs';vào src/main.tstệp của tôi bằng Angular.

Những gì tôi đã làm là:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

Vì vậy, đối với ví dụ trên, nó sẽ là:

apost=\'
sed 's/ones/one'$apost's/'

Tôi không biết tại sao \'nó không hoạt động một mình, nhưng nó là như vậy.



0

Tôi biết điều này sẽ nghe giống như một cảnh sát nhưng tôi không bao giờ có thể bắt đầu hoạt động khi có cả dấu ngoặc kép đơn và dấu ngoặc kép trong chuỗi. Để giúp bất kỳ người mới nào như tôi đang gặp sự cố, một tùy chọn là chia nhỏ chuỗi. Tôi đã phải thay thế mã trong hơn 100 tệp index.hmtl. Các chuỗi có cả dấu nháy đơn và dấu ngoặc kép vì vậy tôi chỉ cần tách chuỗi và thay thế khối đầu tiên bằng <!--và khối thứ hai bằng -->. Nó làm cho các tệp index.html của tôi trở nên lộn xộn nhưng nó vẫn hoạt động.


0

Một số lỗi thoát trên thiết bị đầu cuối AppleMacOSX không thành công:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

sử dụng trình phân tách chuỗi thay thế như ":" để tránh nhầm lẫn với các dấu gạch chéo khác nhau

sed "s:ones:one's:" <<< 'ones thing'

hoặc nếu bạn muốn đánh giá cao câu trích dẫn duy nhất

sed "s:ones:one\'s:" <<< 'ones thing'

cả hai đều trở lại

one's thing
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.