如何将shell脚本变量用作sed的参数?

12

我想要做的是类似于以下方式:

#!/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个回答

17

对于这种引号问题,您可以采取以下方法之一:

#!/bin/sh
SED_ARG="-e 's/SOMETHING//g'"
echo SOMETHING | eval sed "$SED_ARG"
echo SOMETHING | sed $SED_ARG

你的版本中,发生的情况是shell使用了一个参数 (字符串 "-e 's/SOMETHING//g'") 调用了sed,但你想让sed被调用两个参数 ("-e" 和 "'s/SOMETHING//g'")。Eval会使shell按照你想要的方式解释该字符串,不引用参数也会发生单词拆分。请注意,这种操作非常脆弱。


10

将参数传递给sed脚本通过一个写grep的示例进行演示。

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

可以使用grep命令进行查找,例如:

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

0

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

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

2
那是因为你正在做完全不同的事情。 - Swoogan

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

0

EMAIL的值中删除单引号。

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

0

去掉单引号,它就可以正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接