使用ripgrep多行搜索时行号显示错误的原因及解决方法
问题分析与解决
代码示例
defmodule MyModule do app_env(:plans, :myapp, [:billing, :plans], binding_order: [:config], required: true, type: :any ) app_env( :plans_with_min_amount_of_integrations, :myapp, [:billing, :plans_with_min_amount_of_integrations], binding_order: [:config], required: true, type: :any ) end
执行命令
rg --replace '$1' --multiline --multiline-dotall "app_env.*?(myapp).*?billing" test.txt
问题原因
- 行号显示逻辑:ripgrep默认显示的是整个正则匹配的起始行,而非捕获组
myapp所在的行。第二个匹配中,正则从第8行的app_env(开始匹配,虽然myapp实际在第10行,但ripgrep会把整个匹配的起始行(第8行)作为结果行号输出。 - 匹配范围过宽:
.*?在--multiline-dotall模式下会匹配换行符,当前示例虽无跨块问题,但在大规模代码中可能意外跨多个app_env调用块,导致错误匹配。
解决方案
修改后的命令
rg --replace '$1' --only-matching "app_env\([^)]*?(myapp)[^)]*?:billing" test.txt
关键调整说明
app_env\(:精准匹配app_env函数调用的起始括号,避免误匹配其他含app_env的字符串。[^)]*?:非贪婪匹配除)外的任意字符,确保整个匹配被限制在当前app_env()调用块内,不会跨到其他函数调用。--only-matching:让ripgrep只输出捕获组匹配的内容,并以捕获组myapp所在行作为行号,最终会输出你预期的第2行和第10行结果。
内容的提问来源于stack exchange,提问作者oldhomemovie
相关产品推荐
相关产品推荐

