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'
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'
Câu trả lời:
Trích dẫn sed
mã 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
sed -i
bất kỳ lý do cụ thể nào?
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!
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.
Cách tốt nhất là sử dụng $'some string with \' quotes \''
ví dụ:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
là dành riêng cho Bash, vì vậy nó không thể di động với POSIX shell.
bash
cụ thể. Nó cũng có sẵn trong ksh
và zsh
, 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.
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 và 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
Đâ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.ts
tệ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.
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.