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中定义的?
你的两个例子看起来完全一样,这使得难以诊断的问题。 潜在问题:
-
你可能需要双引号,如在
sed 's/xxx/'"$PWD"'/'
-
$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>