2010-06-10 38 views
8

Tôi tin rằng đây có thể là một câu hỏi đơn giản, nhưng tôi đã xem ở khắp mọi nơi và đã thử một số cách giải quyết, nhưng tôi vẫn chưa giải quyết được vấn đề.Sed không hoạt động bên trong tập lệnh bash

Vấn đề mô tả: tôi phải thay thế một nhân vật bên trong một tập tin và tôi có thể làm điều đó một cách dễ dàng bằng cách sử dụng dòng lệnh:

sed -e 's/pattern1/pattern2/g' full_path_to_file/file 

Nhưng khi tôi sử dụng cùng một dòng bên trong một kịch bản bash tôi không thể dường như có thể thay thế nó và tôi không nhận được thông báo lỗi, chỉ nội dung tệp mà không có sự thay thế.

#!/bin/sh 

VAR1="patter1" 
VAR2="patter2" 

VAR3="full_path_to_file" 

sed -e 's/${VAR1}/${VAR2}/g' ${VAR3} 

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn bạn rất nhiều vì đã dành thời gian.

+0

sed -e không thay đổi tệp, chỉ hiển thị tệp với trạm biến áp, nhưng tệp không bị thay đổi, trong cả hai trường hợp – chmeee

Trả lời

17

Hãy thử

sed -e "s/${VAR1}/${VAR2}/g" ${VAR3} 

Bash reference nói:

Các nhân vật '$' và '`' giữ lại ý nghĩa đặc biệt của họ trong dấu ngoặc kép

Như vậy nó sẽ có thể giải quyết biến của bạn

0

Tôi sử dụng tập lệnh li ke của bạn ... và công việc của tôi là tốt!

#!/bin/sh 

var1='pattern1' 
var2='pattern2' 

sed -i "s&$var1&$var2&g" *.html 

Thấy rằng, tôi sử dụng "-i" ... và ký tự seperator "&" Tôi sử dụng khác với của bạn. Ký tự phân tách "&" có thể được sử dụng cho bất kỳ ký tự nào khác KHÔNG CÓ MẪU.

Bạn có thể sử dụng:

sed -i "s#$var1#$var2#g" *.html 

sed -i "[email protected][email protected][email protected]" *.html 

...

Nếu mô hình của tôi là: "[email protected]" tất nhiên bạn phải sử dụng một seperator khác nhau như "#", "%" ... được?

Các vấn đề liên quan