使用带有sed的变量但具有转义问题

时间:2013-11-07 21:28:10

标签: sed

我正在尝试使用sed执行内联搜索和替换,但我认为奇怪的字符会导致问题。

我的config.inc文件包含2行:

$GLOBALS['industry_id'] = '1';
yyyy

像这样的简单工作并用zzzz替换yyyy:

x="yyyy"
y="zzzz"
sed -i "s/${x}/${y}/" config.inc

但是这样的事情不起作用:

x="$GLOBALS['industry_id'] = '1';"
y="$GLOBALS['industry_id'] = '3';"
sed -i "s/${x}/${y}/g" config.inc

我是否需要像$ []'那样转义字符; (虽然这也不起作用):

x="\$GLOBALS\[\'industry_id\'\] = \'1\'\;"
y="\$GLOBALS\[\'industry_id\'\] = \'3\'\;"
sed -i "s/${x}/${y}/g" config.inc

我错过了什么?

由于 克里斯

更新:好的,感谢pfnuesel以下作品:

x="\\\$GLOBALS\\['industry_id'\\] = '1';"
y="$GLOBALS['industry_id'] = '3';"
sed -i "s/${x}/${y}/g" config.inc

1 个答案:

答案 0 :(得分:1)

'$'在bash(参数扩展)中有特殊含义,你需要逃避它,即

$ x="\$GLOBALS['industry_id'] = '1';"

现在你有了

$ echo $x
> $GLOBALS['industry_id'] = '1';

但是如果你尝试sed命令,它仍然无效,因为$sed(行尾)中也有特殊含义。 []sed中也有特殊含义,我们需要将它们全部转义。由于转义字符\也有特殊含义,我们也需要将其转义。

$ x="\\\$GLOBALS\\['industry_id'\\] = '1';"

如果我们现在做

$ echo $x
> \$GLOBALS\['industry_id'\] = '1';

即。特殊字符$[]之前的一个转义字符。

请注意,y不需要这样做,因为$[]在要替换的字符串中都有特殊含义(仅限于要替换的字符串)。