20

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

sed 's/brad/pitt/g'

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

sed s/$1/pitt/g

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

我对报价不太自信,这就是为什么我想看看稍微调整一下会如何工作?

4

2 回答 2

29

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

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

于 2013-02-14T22:55:45.777 回答
4

有两种方法可以做到:

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) 将命令构造为字符串,然后运行其中的 1 个或多个

FOO='s/\(.*\)bar/\1baz/'
BAR="s/$1/pitt/g"
sed -e $BAR -e $FOO <infile >outfile
于 2013-02-14T22:59:20.333 回答