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

标签 bash 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

但是虽然这不会返回错误,但它并没有按照我的意愿进行。它用单个冒号代替字符串,如下所示:

'

我在这里做错了什么?

最佳答案

你可以使用

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

详细信息:

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

注意:

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

关于bash - Perl 单行正则表达式不能正确替换 - 返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69569478/

相关文章:

bash 从命令行参数设置变量

python - 如何在 awk 或 sed 中编写查找所有函数(使用正则表达式)

linux - 为什么这种微小的变化会使 bash 崩溃?

html - 使用 Perl Mechanize Firefox 上传文件

perl - 如何启动 Perl 的交互式控制台?

linux - 如何故意将 Linux 中的可用内存减少给定量?

linux - 如何将 bash 脚本的执行限制为特定用户

perl - 向多个收件人发送电子邮件

perl - 无法修改标量赋值中的常量项

Perl Text::Unaccent 有意想不到的结果