如何使用 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

但它不会改变。我该怎么做?

你需要做更多的转义:

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

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

您需要转义左侧的方括号,以便sed不会将随附的字符串视为括号表达式(要匹配的字符组(。

这可能对你有用(GNU sed(:

sed 's/($cfg['''blowfish_secret'''] = ''')(''';)/1blablabla2/' file

这是一个很好的例子:

  • 反向引用和子表达式
  • 基本正则表达式语法
  • 匹配单引号

对于第三个问题;大多数人(似乎(更喜欢用双引号将整个sed命令括起来。这解决了单引号的问题,但打开了一个副作用,即命令可以被 shell 解释。如果您确定这些副作用不会抬起丑陋的头(变量和 shell 历史记录可以抓住一个(,请继续,而是用单引号将 sed 命令括起来,并且:

  • 将单引号替换为'''
  • 在任何文字[]*^$之前插入

很可能会挽救这一天。

相关内容

最新更新