如何替换包含变量的字符串,下一个包含变量的字符串

时间:2014-07-10 15:02:42

标签: linux bash

我有一个文件" a.sh":

...
AB="${VAR}/example/ep
...

首先,我确保文本在文件中。我用这个:

old='AB="${VAR}/example/ep'
if grep -qxF ${old} a.sh; then
   echo "YES"
else
   echo "NO"
fi

当我确定文本在文件中时,我想将其替换为:

new='AB="${VAR}/example/ep;${VAR}'

我正在尝试使用:

sed -i "s/$old/$new/g" a.sh

但它不起作用。

2 个答案:

答案 0 :(得分:1)

s使用不同的分隔符:

old='AB="${VAR}/example/ep'
new='AB="${VAR}/example/ep;${VAR}'
echo 'AB="${VAR}/example/ep' | sed "s|$old|$new|"

输出:

AB="${VAR}/example/ep;${VAR}

答案 1 :(得分:1)

显然sedhappy with any delimiter你要给它。因此,使用|而不是/sed不会与字符串中的/字符混淆。

#!/bin/sh

old='AB="${VAR}/example/ep'
new='AB="${VAR}/example/ep;${VAR}'

if grep -qxF ${old} a.sh; then
    echo "YES"
else
    echo "NO"
fi

sed -i "s|$old|$new|g" a.sh

这可以通过使用原始代码(不是上面的代码)并使用下面的转义字符修改原始oldnew变量来确认。

old='AB="${VAR}\/example\/ep'
new='AB="${VAR}\/example\/ep;${VAR}'

使用此版本,您的grep来电无法找到它,因为它不喜欢转义字符,但它会被sed取代。

最终,使用|分隔符将是您最简单的修复方法,因为它不会中断您的grep调用,并且会使您的变量与sed