Làm cách nào để sử dụng biến trong lệnh sed?


266

Tôi đã thử các mã sau đây để thay thế QQvới ZZ, nhưng nó không làm những gì tôi muốn:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

Tuy nhiên, mã này thực hiện những gì tôi muốn:

sed -i 's/QQ/ZZ/g' $file

Làm thế nào để tôi sử dụng các biến trong sed?



Câu trả lời:


358

Shell có trách nhiệm mở rộng các biến. Khi bạn sử dụng dấu nháy đơn cho các chuỗi, nội dung của nó sẽ được xử lý theo nghĩa đen, vì vậy sedbây giờ cố gắng để thay thế mỗi lần xuất hiện của nghĩa đen $var1bởi ZZ.

Sử dụng dấu ngoặc kép

Sử dụng dấu ngoặc kép để làm cho vỏ mở rộng các biến trong khi duy trì khoảng trắng:

sed -i "s/$var1/ZZ/g" "$file"

Khi bạn yêu cầu ký tự trích dẫn trong chuỗi thay thế, bạn phải đặt trước nó bằng dấu gạch chéo ngược sẽ được giải thích bởi shell. Trong ví dụ sau, chuỗi quote mesẽ được thay thế bởi "quote me"(ký tự &được diễn giải bởi sed):

sed -i "s/quote me/\"&\"/" "$file"

Sử dụng dấu ngoặc đơn

Nếu bạn có nhiều ký tự meta shell, hãy xem xét sử dụng các dấu ngoặc đơn cho mẫu và dấu ngoặc kép cho biến:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

Chú ý cách tôi sử dụng s,pattern,replacement,thay vì s/pattern/replacement/, tôi đã làm điều đó để tránh sự can thiệp /vào \0/.

Thí dụ

Shell sau đó chạy lệnh trên sedvới các đối số tiếp theo (giả sử pattern=bertfile=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

Nếu file.txtchứa bert, đầu ra sẽ là:

Say hurrah to bert: \0/

2
Làm thế nào một người sẽ vượt qua tùy chọn "/ g" bằng cách sử dụng biểu mẫu được phân tách bằng dấu phẩy này?
blong

6
@ b.long Đó là một glựa chọn, vì vậy bạn sẽ vượt qua s,foo,bar,g.
Lekensteyn

1
ví dụ trích dẫn duy nhất của bạn là hữu ích, bao gồm sed sử dụng mô hình regex khá độc đáo!
Brian Thomas

Trong trường hợp bạn muốn sử dụng \\0thay vì \0, không nên thực hiện khi \0được đặt trong dấu ngoặc đơn. Nếu không sedsẽ thay thế mô hình cho một nghĩa đen \0thay vì toàn bộ trận đấu.
Lekensteyn

Đã lừa tôi.
jimh

114

Chúng ta có thể sử dụng các biến trong sedviệc sử dụng dấu ngoặc kép:

sed -i "s/$var/r_str/g" file_name

Nếu bạn có một dấu gạch chéo /trong biến thì hãy sử dụng dấu phân cách khác nhau, như dưới đây:

sed -i "s|$var|r_str|g" file_name

7
Nếu bạn có một dấu gạch chéo /trong biến => Điều này đã cứu tôi! Biến của tôi là một url và nó chứa /. Chuyển sang sử dụng |làm dấu phân cách đã khắc phục sự cố của tôi
sonlexqt

Đồng ý với "nếu bạn có dấu gạch chéo trong biến"
Tiina
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.