sed中的环境variablesreplace

如果我从脚本运行这些命令:

#my.sh PWD=bla sed 's/xxx/'$PWD'/' ... $ ./my.sh xxx bla 

没事。

但是,如果我运行:

 #my.sh sed 's/xxx/'$PWD'/' ... $ ./my.sh $ sed: -e expression #1, char 8: Unknown option to `s' 

我在教程中看到,要从shell中replace环境variables,你需要停止,并且'out quote' $varname部分,这样它就不会被直接replace,这就是我所做的,只有当variables被定义之前。

我怎样才能让sed识别$var作为一个环境variables,因为它是在shell中定义的?

你的两个例子看起来完全一样,这使得难以诊断的问题。 潜在问题:

  1. 你可能需要双引号,如在sed 's/xxx/'"$PWD"'/'

  2. $PWD可能包含一个斜杠,在这种情况下,您需要find一个包含在$PWD的字符作为分隔符。

要同时指出这两个问题,也许

 sed 's@xxx@'"$PWD"'@' 

除了诺曼Ramsey的答案,我想补充说,你可以双引号整个string(这可能会使语句更具可读性和更less的错误)。

所以如果你想search'foo'并用$ BAR的内容replace它,你可以把sed命令放在双引号中。

 sed 's/foo/$BAR/g' sed "s/foo/$BAR/g" 

首先,$ BAR不会正确扩展,而第二个$ BAR会正确扩展。

您可以使用除“/”之外的其他字符进行replace:

 sed "s#$1#$2#g" -i FILE 

另一个简单的select

由于$PWD通常会包含一个斜杠/ ,所以使用| 而不是/为sed语句:

 sed -e "s|xxx|$PWD|" 

随着你的问题编辑,我看到你的问题。 假设当前目录是/home/yourname …在这种情况下,您的命令如下:

 sed 's/xxx/'$PWD'/' 

将扩大到

 sed `s/xxx//home/yourname// 

这是无效的。 如果你想这样做的话,你需要在你的$ PWD中的每个/前面加一个\字符。

 VAR=8675309 echo "abcde:jhdfj$jhbsfiy/.hghi$jh:12345:dgve::" |\ sed 's/:[0-9]*:/:'$VAR':/1' 

VAR包含你想要replace的字段

实际上,最简单的事情(至less在gnu sed中)是为sedreplace(s)命令使用不同的分隔符。 所以,而不是s / pattern /'$ mypath'/被扩展为s / pattern // my / path /这当然会混淆s命令,请使用s!pattern!'$ mypath'! 这将被扩展到s!pattern!/ my / path! 我已经使用了爆炸(!)字符(或者使用任何你喜欢的字符),这样就避免了通常的,但是不是用你的select的正斜杠作为分隔符。

我有类似的问题,我有一个列表,我必须build立一个基于模板(包含@INPUT@作为元素replace)的SQL脚本:

 for i in LIST do awk "sub(/\@INPUT\@/,\"${i}\");" template.sql >> output done 

处理sed中的VARIABLES

 [root@gislab00207 ldom]# echo domainname: None > /tmp/1.txt [root@gislab00207 ldom]# cat /tmp/1.txt domainname: None [root@gislab00207 ldom]# echo ${DOMAIN_NAME} dcsw-79-98vm.us.oracle.com [root@gislab00207 ldom]# cat /tmp/1.txt | sed -e 's/domainname: None/domainname: ${DOMAIN_NAME}/g' --- Below is the result -- very funny. domainname: ${DOMAIN_NAME} --- You need to single quote your variable like this ... [root@gislab00207 ldom]# cat /tmp/1.txt | sed -e 's/domainname: None/domainname: '${DOMAIN_NAME}'/g' --- The right result is below domainname: dcsw-79-98vm.us.oracle.com 

不好的方法:改变分隔符

 sed 's/xxx/'"$PWD"'/' sed 's:xxx:'"$PWD"':' sed 's@xxx@'"$PWD"'@' 

也许那些不是最终的答案,

你不知道在$PWD/ : OR @会出现什么字符。

好的方法是取代$PWD的特殊字符。

好方法:转义分隔符

例如:

使用/作为分隔符

 echo ${url//\//\\/} x.com:80\/aa\/bb\/aa.js echo ${url//\//\/} x.com:80/aa/bb/aa.js echo "${url//\//\/}" x.com:80\/aa\/bb\/aa.js echo $tmp | sed "s/URL/${url//\//\\/}/" <a href="x.com:80/aa/bb/aa.js">URL</a> echo $tmp | sed "s/URL/${url//\//\/}/" <a href="x.com:80/aa/bb/aa.js">URL</a> 

要么

使用:作为分隔符(更可读)

 echo ${url//:/\:} x.com:80/aa/bb/aa.js echo "${url//:/\:}" x.com\:80/aa/bb/aa.js echo $tmp | sed "s:URL:${url//:/\:}:g" <a href="x.com:80/aa/bb/aa.js">x.com:80/aa/bb/aa.js</a>