Làm thế nào để tôi sử dụng biến trong một sed lệnh?

Tôi đã cố gắng sau mã để thay thế QQ với ZZ nhưng nó không làm những gì tôi muốn:

var1=QQsed -i 's/$var1/ZZ/g' $file

Tuy nhiên, điều này mã làm những gì tôi muốn:

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

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

Vỏ là trách nhiệm cho việc mở rộng biến. Khi bạn sử dụng duy nhất báo cho dây, nội dung của nó sẽ được đối xử theo nghĩa đen, do đó, sed bây giờ cố gắng để thay thế mỗi lần xuất hiện của các chữ $var1 bởi ZZ.

Sử dụng đôi trích

Sử dụng đôi giá để tạo vỏ 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 các báo nhân vật trong việc thay thế chuỗi, anh phải đi trước khi nó với một xổ sau đó sẽ được giải thích bởi vỏ. Trong ví dụ sau, các chuỗi quote me sẽ được thay thế bởi "quote me" (nhân vật & được giải thích bởi sed):

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

Cách duy nhất trích

Nếu đã rất nhiều vỏ siêu nhân vật xem xét sử dụng duy nhất báo cho các mẫu, và tăng gấp đôi giá cho sự biến:

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

Thông báo làm thế nào tôi sử dụng s,pattern,replacement, thay vì s/pattern/replacement/ Tôi đã làm nó để tránh sự can thiệp với những / trong \0/.

Ví dụ

Vỏ sau đó chạy trên lệnh sed với sự tiếp theo lý luận (giả sử pattern=bertfile=text.txt):

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

Nếu file.txt chứa bert đầu ra sẽ được:

Say hurrah to bert: \0/

Chúng ta có thể sử dụng biến trong sed sử dụng đôi trích:

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

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

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

Để mở rộng (chơi chữ dự định) trên @huy của câu trả lời,

  • giải pháp này sẽ làm việc cho thường xuyên biểu thức ăn cho lệnh khác, như perl
  • sử dụng đôi giá xung quanh để (vâng, ngay dưới Unixy hệ thống) để mở rộng biến như dự kiến
  • | có thể xuất hiện trong biến của bạn là giá trị là tốt, vì vậy không được sợ hãi để thử cách khác

xem câu trả lời của tôi, trong bài này của anh

liên quan: Escape a string for a sed replace pattern - Stack Overflow