首页 > 解决方案 > Perl 单行正则表达式不能正确替换 - 返回错误

问题描述

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

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

bind_password = 'grafana'

变成这样:

bind_password = ''

我尝试在包含该行的文件上使用以下正则表达式单行:

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

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

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

但是,虽然这不会返回错误,但它并没有做我想要的。相反,它用一个冒号替换字符串,如下所示:

'

我在这里做错了什么?

标签: bashperl

解决方案


您可以使用

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

详情

  • -i- 修改文件内容
  • bind_password = '\K- 匹配bind_password = '并从匹配值中删除此文本(使其在文件中保持不变)
  • grafana- 你的grafana
  • (?=') - 紧随其后'(但'不被消耗,因此它完好无损地保留在文件中)

笔记:

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

推荐阅读