0

我正在尝试使用 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
4

1 回答 1

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,因为在要替换的字符串中(仅在要替换的字符串中)都没有$,也没有[或没有特殊含义。]

于 2013-11-07T21:35:13.630 回答