sed变量替换似乎不起作用

时间:2011-01-07 10:27:37

标签: variables sed

我在shell中设置了一个变量:

-bash-3.00$ echo $source_repl
source ../setup_simple.tcl

然后我尝试用变量字符串替换以字符串“package require IxLoad”开头的文件中的一行(注意双引号是使sed使用变量替换的方法)。首先我尝试直接替换(没有转义变量中的$):

-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
sed: -e expression #1, char 38: unknown option to `s'
-bash-3.00$

所以我认为转义$会解决问题,但是你可以看到该行替换为文字字符串“$ source_repl”而不是存储在那里的变量:

-bash-3.00$ sed -e "s/package require IxLoad.*/\$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl
11c11
< package require IxLoad
---
> $source_repl
-bash-3.00$ 

我查了很多关于如何在sed中进行变量替换的网站,他们似乎都表明上面应该有效。我错过了什么?实际变量中是否存在导致此问题的内容?

A

3 个答案:

答案 0 :(得分:1)

您的变量中有/。使用@作为模式分隔符,这将是。

sed -e "s@package require IxLoad.*@$source_repl@g" smtp_tput191Mb.tcl > tmpwatch.tcl

答案 1 :(得分:1)

我一般不知道如何处理这个问题(更改分隔符很简单,但你永远不知道变量中可以包含什么),但是如果你可以使用perl而不是{{1你可以在perl中加载环境变量表单以避免转义问题:

sed

答案 2 :(得分:0)

抱歉浪费时间。我发现了这个问题。我需要在实际变量中转义点和斜杠,以便用sed语句替换它:

-bash-3.00$ echo $source_repl
source \.\.\/setup_simple\.tcl
-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl                                          11c11
< package require IxLoad
---
> source ../setup_simple.tcl
-bash-3.00$

由于