使用sed和命令行参数?

时间:2013-02-14 22:51:31

标签: bash sed

我需要像这样运行一个sed命令作为shell脚本的一部分

sed 's/brad/pitt/g'

我应该提供brad作为命令行参数并运行像这样的命令

sed s/$1/pitt/g

虽然这个命令正在运行,但我想知道的是如何在不删除引号的情况下执行此命令,因为我可能在替换字符串中有一些需要引号的内容。

我对引号不太自信,这就是为什么我想通过一些调整来看看事情是如何工作的?

2 个答案:

答案 0 :(得分:18)

您可以sed "s/$1/pitt/g"sed 's/'$1'/pitt/g'

或者,如果命令行参数不是一个简单的单词,sed 's/'"$1"'/pitt/g'

答案 1 :(得分:3)

有两种方法可以做到:

1)使用双引号

 sed "s/$1/pitt/g"

2)将命令构造为字符串并使用eval

运行它
SEDCMD="s/$1/pitt/g"
eval sed $SEDCMD

eval方法有效并且非常灵活,但被认为是危险的,因为它易受代码注入攻击。如果您不信任您的输入,请不要使用#2

更新:注释是正确的,使用eval没有任何好处(我曾经一直使用eval和sed这种方式,我不知道为什么......)构建sed字符串供以后使用,但是,功能强大:所以我会添加一个新的3)并留下2给人们模拟

3)将命令构造为字符串,然后运行其中的一个或多个

FOO='s/\(.*\)bar/\1baz/'
BAR="s/$1/pitt/g"
sed -e $BAR -e $FOO <infile >outfile