2009-07-24 105 views
11

我想要做的就是像下面这样:你如何使用shell脚本变量作为sed的参数?

#!/bin/sh 
EMAIL="-e 's/SOMETHING//g'" 

somecommand | sed "$EMAIL" 

,但我得到以下几点:

sed: -e expression #1, char 2: unknown command: `'' 

我已经尝试了许多变化。我知道这只是让字符串引用正确的问题。我想这样做的原因是为了可读性打破长期的sed命令。我应该使用sed脚本文件(带-f选项)吗?

UPDATE:

我实际的脚本是稍微复杂一些:

#!/bin/sh 
EMAIL="-e s/SOME THING//g -e s/SOME THING ELSE//g ..." 

somecommand | sed "$EMAIL" 

去除单引号后我得到:

sed: -e expression #1, char 18: unknown option to `s' 

回答

16

对于这种类型的报价问题,EVAL几乎总是解。

 
#!/bin/sh 
SED_ARG="-e 's/SOMETHING//g'" 

echo SOMETHING | eval sed "$SED_ARG" 

发生的事情是,在你的版本,外壳调用sed的一个参数(字符串“-e‘S/SOMETHING // G’”),但希望SED用两个参数调用(“-e”和“'s/SOMETHING // g'”)。 Eval使shell以您想要的方式解释字符串。

0

从值中删除单引号EMAIL

EMAIL="-e s/SOMETHING//g" 
0

删除单引号,它应该与写作grep的例子只是罚款

0

这为我工作(双引号环绕声):

env | sed -n /"$USERNAME"/p 
+2

那是因为你在做一些完全不同的事情。 – Swoogan 2009-07-24 17:24:13