You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

问题原因

  1. 行号显示逻辑:ripgrep默认显示的是整个正则匹配的起始行,而非捕获组myapp所在的行。第二个匹配中,正则从第8行的app_env(开始匹配,虽然myapp实际在第10行,但ripgrep会把整个匹配的起始行(第8行)作为结果行号输出。
  2. 匹配范围过宽:.*?在--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:57:38