我正在尝试使用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
答案 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
不需要这样做,因为$
,[
或]
在要替换的字符串中都有特殊含义(仅限于要替换的字符串)。