Câu hỏi Làm cách nào để sử dụng các biến trong lệnh sed?


Tôi đã thử đoạn mã sau để thay thế QQ vớ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 làm những gì tôi muốn:

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

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


179
2017-11-07 16:30


gốc


xem câu trả lời của tôi trong bài đăng này của bạn - ata
có liên quan: stackoverflow.com/questions/407523/… - Ciro Santilli 新疆改造中心 六四事件 法轮功


Các câu trả lời:


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

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

Sử dụng dấu ngoặc kép để làm cho trình bao mở rộng biến trong khi vẫn giữ 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 diễn giải bởi trình bao. Trong ví dụ sau, chuỗi quote me sẽ được thay thế bằng "quote me" (nhân vật & được diễn giải bởi sed):

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

Sử dụng dấu nháy đơn

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

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

Lưu ý cách tôi sử dụng s,pattern,replacement, thay vì s/pattern/replacement/, Tôi đã làm nó để tránh can thiệp với / trong \0/.

Thí dụ

Shell sau đó chạy lệnh trên sed với các đối số tiếp theo (giả định pattern=bert và file=text.txt):

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

Nếu file.txt chứa đựng bert, đầu ra sẽ là:

Say hurrah to bert: \0/

253
2017-11-07 17:20



Làm cách nào để chuyển tùy chọn "/ g" bằng biểu mẫu được phân cách bằng dấu phẩy này? - blong
@ b.long Đó là một g tùy chọn, vì vậy bạn sẽ vượt qua s,foo,bar,g thay thế. - Lekensteyn
ví dụ trích dẫn đơn của bạn hoàn toàn hữu ích, bao gồm sed sử dụng mẫu regex khá độc đáo! - Brian Thomas
Trong trường hợp bạn bị cám dỗ sử dụng \\0 thay vì \0, nó không nên được thực hiện khi \0 được bao gồm trong dấu nháy đơn. Nếu không thì sed sẽ thay thế mẫu cho một chữ \0 thay vì toàn bộ trận đấu. - Lekensteyn


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

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

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

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

79
2017-08-07 15:29