这可能是显而易见的事情,但我不得不问,因为我没有看到它。
我正在尝试在此文本文件中进行以下替换。我想要这个:
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/