# search_and_replace
The `search_and_replace` tool finds and replaces text within a file, supporting both literal strings and regular expression patterns. It allows for targeted replacements across multiple locations, optionally within specific line ranges.
## Parameters
### Required Parameters
- `path`: The relative path (from the workspace root) of the file to modify.
- `search`: The text string or regex pattern to find.
- `replace`: The text to replace matches with.
### Optional Parameters
- `start_line`: The 1-based line number where the search scope begins.
- `end_line`: The 1-based line number where the search scope ends (inclusive).
- `use_regex`: Set to `"true"` to treat the `search` parameter as a regular expression pattern (default is `false`).
- `ignore_case`: Set to `"true"` to perform a case-insensitive search (default is `false`).
## What It Does
This tool reads the specified file and performs a search-and-replace operation based on the provided parameters. It can operate on the entire file or be restricted to a specific range of lines. Changes are presented in a diff view for user review and approval before being saved.
## When is it used?
- When renaming variables, functions, or classes across a file.
- When updating specific text strings or values consistently.
- When applying patterned changes using regular expressions.
- When refactoring code requires replacing specific patterns.
- When making targeted changes within a defined section of a file.
## Key Features
- **Flexible Searching**: Supports both literal text and regular expression patterns.
- **Case Sensitivity Control**: Option to ignore case during search.
- **Scoped Replacements**: Can limit replacements to a specific range of lines (`start_line`, `end_line`).
- **Global Replacement**: Performs replacements across the entire file (or specified range) by default.
- **Interactive Approval**: Shows proposed changes in a diff view for user review and approval.
- **User Edit Support**: Allows editing the proposed content directly within the diff view.
- **Context Tracking**: Records the file edit operation.
- **Error Handling**: Checks for missing parameters, file access issues, and invalid line numbers.
## Limitations
- **Single File Operation**: Operates on only one file at a time. Use `search_files` to find patterns across multiple files first.
- **Review Overhead**: The mandatory diff view approval adds an interactive step.
- **Regex Complexity**: Complex regex patterns might require careful construction and testing.
## How It Works
When the `search_and_replace` tool is invoked, it follows this process:
1. **Parameter Validation**: Checks for required `path`, `search`, `replace`, and validates optional parameters like line numbers and boolean flags.
2. **File Reading**: Reads the content of the target file specified by `path`.
3. **Regex Construction**:
* If `use_regex` is `false`, the `search` string is escaped to treat it as literal text.
* A `RegExp` object is created with the `g` (global) flag and optionally the `i` (ignore case) flag.
4. **Replacement Execution**:
* If `start_line` or `end_line` are provided, the file content is split into lines, the relevant section is isolated, the replacement is performed on that section, and the file content is reconstructed.
* If no line range is specified, the replacement is performed on the entire file content string.
5. **Diff View Interaction**:
* Opens the file in the diff view showing original vs. proposed content.
* Updates the diff view with the result of the replacement.
6. **User Approval**: Presents the change via `askApproval`. Reverts if rejected.
7. **Saving Changes**: If approved, saves the changes (including any user edits made in the diff view).
8. **File Context Tracking**: Tracks the edit using `cline.getFileContextTracker().trackFileContext`.
9. **Result Reporting**: Reports success (including user edits) or failure back to the AI model.
## Usage Examples
Simple text replacement throughout a file:
```xml
src/config.js
API_KEY_OLD
API_KEY_NEW
```
Case-insensitive regex replacement to update function calls:
```xml
src/app.ts
processData\((.*?)\)
handleData($1)
true
true
```
Replacing text only within lines 10 to 20:
```xml
README.md
Draft
Final
10
20
```