sed变量用bash替换

时间:2014-04-29 20:40:34

标签: bash sed

我已在Debian 7上将shell从dash更改为bash 4.2.37

现在,以下内容不再有效:

sed -i.bak "/${VARIABLE}/d" /path/file
sed -i.bak '/'$VARIABLE'/d' /path/file

产生:

sed: -e expression #1, char 0: no previous regular expression  

OS X上的bash 3.2按预期工作

2 个答案:

答案 0 :(得分:2)

无论你的shell如何,sed语法错误都是一样的。如果VARIABLE为空,那就是你得到的。

更改shell可能会更改定义的变量。例如,BASH_VERSION显然只会在Bash中设置。或者您可以在.bashrc中本地定义变量,Dash不会读取; Bash使用了许多其他启动文件,但Dash没有。

您可以做的是将脚本更改为要设置VARIABLE

: ${variable?Not set}

如果未设置变量,这是一个常见的Bourne shell习惯用法。 :伪命令就像一个注释,但它会评估它的参数;如果${variable?Message}未设置,评估后Message将使用variable退出shell。

答案 1 :(得分:1)

将其包装在if语句中:

if [[ ! -z $VAR ]]; then 
    sed -i.bak /"${VAR}"/d test; 
fi

或作为oneliner:

if [[ ! -z $VAR ]]; then sed -i.bak /"${VAR}"/d filename.txt; fi

甚至更简单:

[[ ! -z $VAR ]] && sed -i.bak /"${VAR}"/d filename.txt

原始答案: 以下适用于我:

sed -i.bak /"$VARIABLE"/d /path/file

GNU Bash 4.2-2ubuntu2.1