【问题标题】:How do you use shell script variables as arguments to sed?如何使用 shell 脚本变量作为 sed 的参数?
【发布时间】:2010-11-13 19:28:07
【问题描述】:

我想做的事情如下:

#!/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'

【问题讨论】:

    标签: bash shell scripting variables sed


    【解决方案1】:

    对于此类引用问题,您可以执行以下操作之一:

    #!/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 以您想要的方式解释字符串,因为不引用参数以便发生分词。请注意,这种东西非常脆弱。

    【讨论】:

      【解决方案2】:

      将所有内容放在单引号中,稍后在使用时让 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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 那是因为你在做完全不同的事情。
        【解决方案4】:

        Passing arguments into a sed script 附有写grep的例子。

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

        grep 可以这样做,

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

        【讨论】:

          【解决方案5】:

          删除单引号,它应该可以正常工作

          【讨论】:

            【解决方案6】:

            EMAIL 的值中删除单引号。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-23
              • 2010-10-20
              • 2015-01-21
              • 1970-01-01
              • 2021-08-21
              • 1970-01-01
              • 2013-06-24
              • 2014-11-12
              相关资源
              最近更新 更多