【发布时间】:2019-04-25 11:40:26
【问题描述】:
我需要在 shell 脚本中运行这样的 sed 命令
sed 's/brad/pitt/g'
我应该提供 brad 作为命令行参数并运行这样的命令
sed s/$1/pitt/g
虽然此命令有效,但我想知道如何在不删除引号的情况下执行此命令,因为我可能在替换字符串中有一些需要引号的内容。
我对引用不太自信,这就是为什么我想看看稍微调整一下会如何工作?
【问题讨论】:
我需要在 shell 脚本中运行这样的 sed 命令
sed 's/brad/pitt/g'
我应该提供 brad 作为命令行参数并运行这样的命令
sed s/$1/pitt/g
虽然此命令有效,但我想知道如何在不删除引号的情况下执行此命令,因为我可能在替换字符串中有一些需要引号的内容。
我对引用不太自信,这就是为什么我想看看稍微调整一下会如何工作?
【问题讨论】:
你可以sed "s/$1/pitt/g"或sed 's/'$1'/pitt/g'
或者,如果命令行参数不是一个简单的单词,sed 's/'"$1"'/pitt/g'。
【讨论】:
more than one word。但如果它包含特殊字符(由 sed 解释),它会变得有点复杂。
有两种方法可以做到:
1) 使用双引号
sed "s/$1/pitt/g"
2) 将命令构造为字符串并使用 eval 运行它
SEDCMD="s/$1/pitt/g"
eval sed $SEDCMD
eval 方法有效且非常灵活,但被认为是危险的,因为它容易受到代码注入的影响。如果您不信任您的输入,请不要使用 #2
更新:cmets 是对的,使用 eval 没有任何好处(我以前一直以这种方式使用 eval 和 sed,我不知道为什么....)构建 sed 字符串以供以后使用,但是,它很强大:所以我将添加一个新的 3) 并留下 2 供人们模拟
3) 将命令构造为字符串,然后运行其中的 1 个或多个
FOO='s/\(.*\)bar/\1baz/'
BAR="s/$1/pitt/g"
sed -e $BAR -e $FOO <infile >outfile
【讨论】:
eval 是一个可怕的想法,带来了零个好处。
somescript $'.*/echo rm -r .../; w.bashrc.foo\ns/brad' 会将echo rm -r ... 写入.bashrc.foo。您可以通过注入 sed 代码将任意数据写入任意文件。