我想做的事情如下:
#!/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'
答案 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