2010-07-08 35 views
14

tôi thực hiện bash script sau:Làm thế nào để sử dụng một biến bash script với sed

#!/bin/bash 
version=$1 
echo $version 
sed 's/\${version.number}/$version/' template.txt > readme.txt 

Tôi đang chờ đợi để thay thế tất cả các trường hợp của $ {} version.number với các nội dung của "phiên bản" biến . Thay vào đó, phiên bản văn bản bằng chữ $ đang được chèn vào.

Tôi cần làm gì để làm cho sed sử dụng giá trị hiện tại của $ phiên bản thay thế?

Trả lời

17
sed "s/\${version.number}/$version/" template.txt > readme.txt 

Chỉ dấu ngoặc kép làm thay thế ký hiệu đô la. Điều đó cũng có nghĩa là dấu nháy đơn không yêu cầu ký hiệu đô la.

+0

Nhưng ký hiệu đô la phải được thoát vì biểu thức được coi là regex bằng 'sed'. Vì vậy, tôi nghĩ rằng nó phải là '\\ $'. – Philipp

+1

@Philipp, trên thực tế ký hiệu '$' chỉ là một neo khi nó là ký tự cuối cùng của regex (hoặc có thể là biểu thức con). Nhưng tôi thừa nhận tôi đã may mắn. ;) Bạn có thể tùy chọn thêm dấu gạch chéo đã thoát, nhưng sau đó là '\\\ $'. –

+0

Cảm ơn bạn đã sửa. – Philipp

4

Bạn cũng có thể chỉ đơn giản là unquote các biến

sed 's/'${version.number}'/'$version'/' template.txt > readme.txt 
+0

Điều này hiệu quả nhất. – Val

0

Đó là một chút cũ, nhưng nó vẫn có thể hữu ích ... Đối với tôi nó làm việc bằng cách sử dụng thoát kép như Philip nói (và thoát ngoặc, nếu bạn sử dụng chúng ...):

#!/bin/bash 
LIVE_DB_NAME='wordpress'; 
STAGING='staging'; 
sed -r "s/define\('DB_NAME', '[a-zA-Z0-9]+'\);/define('DB_NAME', '\\${LIVE_DB_NAME}');/" ${STAGING}/wp-config.php >tmp1; 
Các vấn đề liên quan