【问题标题】:Using sed with command line argument?使用带有命令行参数的 sed?
【发布时间】:2019-04-25 11:40:26
【问题描述】:

我需要在 shell 脚本中运行这样的 sed 命令

sed 's/brad/pitt/g'

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

sed s/$1/pitt/g

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

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

【问题讨论】:

    标签: bash sed


    【解决方案1】:

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

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

    【讨论】:

    • 您能否详细说明您的第二点?双引号有什么帮助,我的意思是需要什么样的输入?
    • 输入如more than one word。但如果它包含特殊字符(由 sed 解释),它会变得有点复杂。
    • 这就是你需要的:stackoverflow.com/questions/407523/…
    • 我尝试使用 sed -i '' "s/brad/$1/g" 但没有成功。在 MacOS 上
    • sed -i s/$1/pitt/g 文件给出 se_f:1: no matches found: s/$1/pitt/g 。使用 i 标志时,您需要在 $params 周围移动的双引号或单引号。
    【解决方案2】:

    有两种方法可以做到:

    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 是一个可怕的想法,带来了个好处。
    • 如果您不信任您的输入,也不要使用 #1。它也适用于代码注入。
    • @KarolyHorvath somescript $'.*/echo rm -r .../; w.bashrc.foo\ns/brad' 会将echo rm -r ... 写入.bashrc.foo。您可以通过注入 sed 代码将任意数据写入任意文件。
    猜你喜欢
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多