你如何使用shell脚本变量作为sed的参数?

时间:2009-07-24 16:48:50

标签: bash shell scripting variables sed

我想做的事情如下:

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

somecommand | sed "$EMAIL"

但我得到以下内容:

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

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

更新

我的实际脚本有点复杂:

#!/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'

6 个答案:

答案 0 :(得分:17)

对于这种类型的引用问题,eval几乎总是解决方案。

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

echo SOMETHING | eval sed "$SED_ARG"

在你的版本中,shell正在调用带有一个参数的sed(字符串“-e's / SOMETHING // g'”),但是你想用两个参数调用sed(“ - e “和”/ s / SOMETHING // g'“)。 Eval使shell以您希望的方式解释字符串。

答案 1 :(得分:9)

Passing arguments into a sed script显示了撰写grep的示例。

#!/bin/sh
#File: sedgrep
sed -n 's/'"$1"'/&/p'

grep可以完成,

sedgrep '[A-Z][A-Z]' <file

答案 2 :(得分:0)

EMAIL的值中删除单引号。

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

答案 3 :(得分:0)

删除单引号,它应该可以正常工作

答案 4 :(得分:0)

这对我有用(用双引号括起来):

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

答案 5 :(得分:0)

将所有内容放在单引号中,让shell在以后使用时将其评估。

EMAIL='-e s/bar@baz.com//g'
EMAIL2='-e s/foo@bar.com//g;s/foo@bar.org//g'
echo "foo@bar.com foo@bar.org foo@baz.com bar@baz.com" | sed $EMAIL $EMAIL2