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
话(?=')
- 紧随其后'
(但'
不被消耗,因此它完好无损地保留在文件中)
笔记:
- 您不需要
0
,-0pe
因为您的匹配不跨越多行 - 转义单引号不能这样工作,在表达式周围使用双引号更简单,尽管有时连接是唯一的方法
- 您不需要
g
标志,因为它perl
是逐行工作的,并处理所有行(g
当每行有多个匹配项时是必需的)。
推荐阅读
- jenkins - 如何从管道中的 zip 访问环境变量?
- groovy - 如何从项目拆除脚本中获取所有总测试用例计数和状态
- reactjs - 针对特定组件的 React Router Links
- c - 为什么这个 C 程序的输出是 64 而不是 320?
- laravel - 如何检查插入是否执行?
- node.js - node.js for 循环不使用 continue 命令循环
- python - 保护 psycopg2 连接的明文密码字符串?
- highcharts - Highchart Pie 聊天不显示 Codeigniter
- sql - SQL Server:如何显示 case 语句中的占位符行?
- ruby - 由于旧的 libxml2,厨师命令失败