Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables sed变量替换似乎不起作用_Variables_Sed - Fatal编程技术网

Variables sed变量替换似乎不起作用

Variables sed变量替换似乎不起作用,variables,sed,Variables,Sed,我在shell中设置了一个变量: -bash-3.00$ echo $source_repl source ../setup_simple.tcl 然后我尝试用变量字符串替换文件中以字符串“package require IxLoad”开头的一行(注意双引号是让sed使用变量替换的方法)。首先,我尝试使用直接替换(不转义变量中的$): 因此,我认为转义$可以解决问题,但正如您所看到的,该行随后被文本字符串“$source_repl”替换,而不是存储在那里的变量: -bash-3.00$ sed

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

-bash-3.00$ echo $source_repl
source ../setup_simple.tcl
然后我尝试用变量字符串替换文件中以字符串“package require IxLoad”开头的一行(注意双引号是让sed使用变量替换的方法)。首先,我尝试使用直接替换(不转义变量中的$):

因此,我认为转义$可以解决问题,但正如您所看到的,该行随后被文本字符串“$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$ 
-bash-3.00$sed-e“s/package需要IxLoad.*/\$source\u repl/g”smtp\u tput191Mb.tcl>tmpwatch.tcl
-bash-3.00$diff smtp_tput191Mb.tcl tmpwatch.tcl
11c11
<包需要IxLoad
---
>$source\u repl
-bash-3.00美元
我查阅了许多关于如何在sed中进行变量替换的网站,它们似乎都表明上述方法应该有效。我错过了什么?实际变量中是否有导致这种情况的原因


A变量中有一个
/
。使用@作为模式分隔符,这将继续

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

一般来说,我不知道如何解决这个问题(更改分隔符很容易,但您永远不知道变量中可以包含什么),但是如果您可以使用
perl
而不是
sed
,您可以在perl中加载环境变量表单以避免转义问题:

perl -pe 's/package require IxLoad.*/$ENV{source_repl}/g' smtp_tput191Mb.tcl > tmpwatch.tcl

抱歉浪费了你的时间。我发现了问题。我需要转义实际变量中的点和斜线,以便用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$
-bash-3.00$echo$source\u repl
source\.\.\/setup\u simple\.tcl
-bash-3.00$sed-e“s/package require IxLoad.*/$source\u repl/g”smtp\u tput191Mb.tcl>tmpwatch.tcl
-bash-3.00$diff smtp_tput191Mb.tcl tmpwatch.tcl 11c11
<包需要IxLoad
---
>源../setup\u simple.tcl
-bash-3.00$

谢谢

谢谢。我只是注意到了。我看问题的方式不对。当圆点位于
s//
命令的右侧时,它们不需要转义。
-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$