Perl 单行正则表达式不能正确替换 - returns 错误

Perl one-liner regex doesn't substitute correctly - returns error

这可能是显而易见的事情,但我不得不问一下,因为我没有看到它。

我正在尝试在此文本文件中进行以下替换。我想要这个:

bind_password = 'grafana'

变成这样:

bind_password = ''

我已尝试在包含以下行的文件中使用以下正则表达式一行:

$ perl -0pe 's/(bind_password = \')grafana\'/\'/g' file.txt
bash: syntax error near unexpected token `)'

当我在 regex101 上尝试正则表达式时,它运行良好:https://regex101.com/r/0fb4Pu/1。区别在于我不得不转义单引号。我试过在正则表达式周围使用双引号而不是单引号,如:

perl -0pe "s/(bind_password = ')grafana'/'/g" file.txt

虽然这不是 return 错误,但它并不符合我的要求。它用单个冒号代替字符串,如下所示:

'

我做错了什么?

您可以使用

perl -i -pe "s/bind_password = '\Kgrafana(?=')//" file.txt

详情:

  • -i - 修改文件内容
  • bind_password = '\K - 匹配 bind_password = ' 并从匹配值中删除此文本(以便它在文件中保持完整)
  • grafana - 你的grafana
  • (?=') - 后跟 '(但 ' 未被消耗,因此它完整地保留在文件中)

注:

  • 您不需要 -0pe 中的 0,因为您的匹配没有跨越多行
  • 转义单引号不是这样工作的,在表达式周围使用双引号更简单,尽管有时连接是唯一的方法
  • 您不需要 g 标志,因为此 perl 逐行工作,并处理所有行(当每行有多个匹配项时,g 是必需的).