Skip to main content

search_and_replace

search_and_replace工具在文件中查找并替换文本,支持字面字符串和正则表达式模式。它允许在多个位置进行针对性替换,可选择在特定行范围内操作。


参数

必需参数

  • path: 要修改文件的相对路径(相对于工作区根目录)
  • search: 要查找的文本字符串或正则表达式模式
  • replace: 用于替换匹配项的文本

可选参数

  • start_line: 搜索范围开始的基于1的行号
  • end_line: 搜索范围结束的基于1的行号(包含该行)
  • use_regex: 设置为"true"search参数视为正则表达式模式(默认为false)
  • ignore_case: 设置为"true"执行不区分大小写的搜索(默认为false)

功能

此工具读取指定文件并根据提供的参数执行查找替换操作。它可以作用于整个文件或限制在特定行范围内。更改会在差异视图中展示,供用户审核批准后再保存。


使用场景

  • 重命名文件中的变量、函数或类时
  • 一致更新特定文本字符串或值时
  • 使用正则表达式应用模式化更改时
  • 重构代码需要替换特定模式时
  • 在文件的定义区域内进行针对性更改时

主要特性

  • 灵活搜索: 支持字面文本和正则表达式模式
  • 大小写控制: 可选择搜索时忽略大小写
  • 范围替换: 可将替换限制在特定行范围内(start_line, end_line)
  • 全局替换: 默认在整个文件(或指定范围)内执行替换
  • 交互式批准: 在差异视图中展示建议更改供用户审核
  • 用户编辑支持: 允许直接在差异视图中编辑建议内容
  • 上下文跟踪: 记录文件编辑操作
  • 错误处理: 检查缺失参数、文件访问问题和无效行号

限制

  • 单文件操作: 一次只能操作一个文件。可先用search_files跨多个文件查找模式
  • 审核开销: 强制性的差异视图批准增加了交互步骤
  • 正则复杂度: 复杂的正则模式可能需要仔细构建和测试

工作原理

当调用search_and_replace工具时,它遵循以下流程:

  1. 参数验证: 检查必需的pathsearchreplace参数,并验证可选参数如行号和布尔标志
  2. 文件读取: 读取path指定的目标文件内容
  3. 正则构建:
    • 如果use_regexfalsesearch字符串会被转义视为字面文本
    • 创建带有g(全局)标志和可选i(忽略大小写)标志的RegExp对象
  4. 替换执行:
    • 如果提供start_lineend_line,文件内容会被拆分为行,隔离相关部分执行替换,然后重建文件内容
    • 如果未指定行范围,替换在整个文件内容字符串上执行
  5. 差异视图交互:
    • 在差异视图中打开文件,显示原始内容与建议内容
    • 用替换结果更新差异视图
  6. 用户批准: 通过askApproval展示更改。如果拒绝则回滚
  7. 保存更改: 如果批准,保存更改(包括用户在差异视图中的任何编辑)
  8. 文件上下文跟踪: 使用cline.getFileContextTracker().trackFileContext跟踪编辑
  9. 结果报告: 向AI模型报告成功(包括用户编辑)或失败

用法示例

简单文本替换整个文件:

<search_and_replace>
<path>src/config.js</path>
<search>API_KEY_OLD</search>
<replace>API_KEY_NEW</replace>
</search_and_replace>

不区分大小写的正则替换更新函数调用:

<search_and_replace>
<path>src/app.ts</path>
<search>processData\((.*?)\)</search>
<replace>handleData($1)</replace>
<use_regex>true</use_regex>
<ignore_case>true</ignore_case>
</search_and_replace>

仅在10到20行内替换文本:

<search_and_replace>
<path>README.md</path>
<search>Draft</search>
<replace>Final</replace>
<start_line>10</start_line>
<end_line>20</end_line>
</search_and_replace>