如何使用sed替换包含方括号和美元符号的行中的单词?

时间:2019-08-09 21:08:47

标签: bash sed

我想替换为/usr/share/phpmyadmin/config.inc.php文件

$cfg['blowfish_secret'] = '';

$cfg['blowfish_secret'] = 'blablabla';

带有sed。

我正在尝试:

sed -i "s/\$cfg['blowfish_secret'] = '';/$cfg['blowfish_secret'] = 'blablabla';/g" /usr/share/phpmyadmin/config.inc.php

但是它没有改变。我该怎么办?

2 个答案:

答案 0 :(得分:1)

您需要进行更多转义:

sed -i "s/\$cfg\['blowfish_secret'\] = '';/\$cfg['blowfish_secret'] = 'blablabla';/" /usr/share/phpmyadmin/config.inc.php

由于您的命令用双引号引起来以容纳数据中的单引号字符串,因此您将需要转义两个美元符号,以使$cfg不会被外壳解释为变量。

您需要对左侧的方括号进行转义,以使sed不会将括号中的字符串视为方括号表达式(要匹配的字符组)。

答案 1 :(得分:1)

这可能对您有用(GNU sed):

sed 's/\(\$cfg\['\''blowfish_secret'\''\] = '\''\)\('\'';\)/\1blablabla\2/' file

这是一个很好的例子:

第三个问题;大多数人(似乎)更喜欢用双引号将整个sed命令括起来。这解决了单引号的问题,但带来了副作用,即该命令可由Shell解释。如果您确定这些副作用不会抬起他们的丑陋的头(变量和shell历史记录可以使它们摆脱困境),请继续使用sed命令,并用单引号引起来:

  • '\''代替单引号
  • 在任何文字\[]*^$ \ >

最有可能节省一天。