使用bash变量将多个-e子句传递给sed

时间:2016-06-28 16:21:06

标签: bash sed

我正在从一个数组中创建一个变量,该变量为-e命令构建了多个sed子句。

结果变量类似于:

sedArgs="-e 's/search1/replace1/g' -e 's/search2/replace2/g' -e 's/search3/replace3/g'"

但是当我尝试将sed作为参数调用时,我得到了错误sed: -e expression #1, char 1: unknown command: ''

我试图通过以下方式调用sed:

cat $myFile | sed $sedArgs
cat $myFile | sed ${sedArgs}
cat $myFile | sed `echo $sedArgs`
cat $myFile | sed "$sedArgs"
cat $myFile | sed `echo "$sedArgs"`

并且都会出现同样的错误。

更新 - 重复提问

正如已经确定的那样,这是一个“引用扩展”问题 - 我认为这是sed具体的问题,但是duplicate question that has been identified让我走上正轨。

我设法通过将sedArgs字符串创建为:

来解决此问题
sedArgs="-e s/search1/replace1/g -e s/search2/replace2/g -e s/search3/replace3/g"

并用:

调用它
cat $myFile | sed $sedArgs

完美无缺。

然后我接受了三人的建议,踢了无用的cat

sed $sedArgs $myFile

也很完美。

2 个答案:

答案 0 :(得分:2)

使用BASH数组而不是简单的字符串:

ws1.Range("A1").Autofilter _
    Field:=1, _
    Criteria1:=Array("Mumbai","Delhi"), _
    Operator:=xlFilterValues

答案 1 :(得分:0)

这是没有理智的方法,但您可以将脚本作为单个字符串传递。

sedArgs='s/search1/replace1/g
s/search2/replace2/g
s/search3/replace3/g'

: then

sed "$sedArgs" "$myFile"

单引号字符串跨越多行;当你第一次看到它时,这是可怕的,但完全正常的shell脚本。另请注意cat is useless如何以及如何引用文件名。