Claude Skill

find-replace

Modern find-and-replace using sd (simpler than sed) and batch replacement patterns. Triggers on: sd, find replace, batch replace, sed replacement, string replacement, rename.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download 0xdarkmatter-claude-mods-skills_find-replace-3dfaf0b.zip · 3 KB
Part of 0xdarkmatter/claude-mods — 94 skills

Install

skills CLI npx skills add https://github.com/0xDarkMatter/claude-mods/tree/main/skills/find-replace
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install 0xdarkmatter-claude-mods@llmmart
Git git clone https://github.com/0xDarkMatter/claude-mods.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole 0xdarkmatter/claude-mods collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Find Replace

Modern find-and-replace using sd.

sd Basics

# Replace in file (in-place)
sd 'oldText' 'newText' file.txt

# Replace in multiple files
sd 'oldText' 'newText' *.js

# Preview without changing (pipe)
cat file.txt | sd 'old' 'new'

sd vs sed

sed sd
sed 's/old/new/g' sd 'old' 'new'
sed -i 's/old/new/g' sd 'old' 'new' file
sed 's#path/to#new/path#g' sd 'path/to' 'new/path'

Key difference: sd is global by default, no delimiter issues.

Common Patterns

# Variable/function rename
sd 'oldName' 'newName' src/**/*.ts

# Word boundaries (avoid partial matches)
sd '\boldName\b' 'newName' src/**/*.ts

# Import path update
sd "from '../utils'" "from '@/utils'" src/**/*.ts

# Capture groups
sd 'console\.log\((.*)\)' 'logger.info($1)' src/**/*.js

Safe Batch Workflow

# 1. List affected files
rg -l 'oldPattern' src/

# 2. Preview replacements
rg 'oldPattern' -r 'newPattern' src/

# 3. Apply
sd 'oldPattern' 'newPattern' $(rg -l 'oldPattern' src/)

# 4. Verify
rg 'oldPattern' src/  # Should return nothing
git diff              # Review changes

Special Characters

Character Escape
. \.
* \*
[ ] \[ \]
$ \$
\ \\

Tips

Tip Reason
Always preview with rg -r first Avoid mistakes
Use git before bulk changes Easy rollback
Use \b for word boundaries Avoid partial matches
Quote patterns Prevent shell interpretation

Additional Resources

For detailed patterns, load:

  • ./references/advanced-patterns.md - Regex, batch workflows, real-world examples
Files (claude-mods)
  • assets
    • .gitkeep 0 B · in bundle
  • references
    • advanced-patterns.md 5.4 KB
      # sd Advanced Patterns
      
      Advanced find-and-replace patterns using sd (simpler than sed).
      
      ## Regex Patterns
      
      ### Capture Groups
      
      ```bash
      # Reorder parts
      sd '(\w+)@(\w+)\.com' '$2/$1' emails.txt
      # john@example.com → example/john
      
      # Wrap in function
      sd 'console\.log\((.*)\)' 'logger.info($1)' src/**/*.js
      # console.log(msg) → logger.info(msg)
      
      # Extract and transform
      sd 'class (\w+)' 'export class $1' src/**/*.ts
      ```
      
      ### Word Boundaries
      
      ```bash
      # Match whole words only
      sd '\bfoo\b' 'bar' file.txt
      # "foo" matches, "foobar" doesn't
      
      # Function rename without affecting variables
      sd '\bgetUser\b' 'fetchUser' src/**/*.ts
      ```
      
      ### Optional and Alternation
      
      ```bash
      # Optional whitespace
      sd 'function\s*\(' 'const fn = (' src/**/*.js
      
      # Match alternatives
      sd '(let|var)\s+' 'const ' src/**/*.js
      ```
      
      ### Multiline Patterns
      
      ```bash
      # Match across lines (-s flag)
      sd -s 'start\n.*\nend' 'replacement' file.txt
      
      # Remove multiline blocks
      sd -s '\/\*\*[\s\S]*?\*\/' '' src/**/*.ts
      ```
      
      ## Real-World Patterns
      
      ### Import Transformations
      
      ```bash
      # CommonJS to ES modules
      sd "const (\w+) = require\('([^']+)'\)" "import $1 from '$2'" src/**/*.js
      
      # Relative to absolute imports
      sd "from '\.\./\.\./utils'" "from '@/utils'" src/**/*.ts
      
      # Named imports reorganization
      sd "import \{ (\w+), (\w+) \}" "import { $2, $1 }" src/**/*.ts
      ```
      
      ### API Endpoint Updates
      
      ```bash
      # Version bump
      sd '/api/v1/' '/api/v2/' src/**/*.ts
      
      # Domain migration
      sd 'api\.old\.com' 'api.new.com' src/**/*.ts
      
      # Path restructuring
      sd '/users/(\d+)/posts' '/posts?user_id=$1' src/**/*.ts
      ```
      
      ### Configuration Updates
      
      ```bash
      # Environment variable rename
      sd 'DATABASE_URL' 'DB_CONNECTION_STRING' .env* src/**/*.ts
      
      # Port number change
      sd 'port:\s*3000' 'port: 8080' **/*.yaml **/*.json
      
      # Version strings
      sd '"version":\s*"\d+\.\d+\.\d+"' '"version": "2.0.0"' package.json
      ```
      
      ### Code Modernization
      
      ```bash
      # Async/await from promises
      sd '\.then\(\((\w+)\)\s*=>\s*\{' 'const $1 = await ' src/**/*.ts
      
      # Template literals
      sd '"\s*\+\s*(\w+)\s*\+\s*"' '${$1}' src/**/*.ts
      
      # Optional chaining
      sd '(\w+)\s*&&\s*\1\.(\w+)' '$1?.$2' src/**/*.ts
      ```
      
      ### React/JSX Patterns
      
      ```bash
      # className to class (or vice versa)
      sd 'className="' 'class="' src/**/*.jsx
      sd 'class="' 'className="' src/**/*.jsx
      
      # Event handler rename
      sd 'onClick=\{' 'onPress={' src/**/*.tsx
      
      # Hook migration
      sd 'componentDidMount\(\)' 'useEffect(() => {' src/**/*.tsx
      ```
      
      ### Remove Code
      
      ```bash
      # Console logs
      sd 'console\.log\([^)]*\);?\s*\n?' '' src/**/*.ts
      
      # Debug statements
      sd '// DEBUG:.*\n' '' src/**/*.ts
      
      # Commented code blocks
      sd '//\s*[A-Za-z].*\n' '' src/**/*.ts  # Single line comments with code
      
      # TODO comments
      sd '// TODO:.*\n' '' src/**/*.ts
      ```
      
      ## Batch Workflows
      
      ### Safe Preview Pattern
      
      ```bash
      # 1. List affected files
      rg -l 'oldPattern' src/
      
      # 2. Preview replacements (rg with -r)
      rg 'oldPattern' -r 'newPattern' src/
      
      # 3. Apply to found files
      sd 'oldPattern' 'newPattern' $(rg -l 'oldPattern' src/)
      
      # 4. Verify
      rg 'oldPattern' src/  # Should return nothing
      
      # 5. Review changes
      git diff
      ```
      
      ### With fd for File Selection
      
      ```bash
      # TypeScript files only
      fd -e ts -x sd 'old' 'new' {}
      
      # Specific directories
      fd -e js . src/ lib/ -x sd 'old' 'new' {}
      
      # Exclude patterns
      fd -e ts -E "*.test.ts" -E "*.spec.ts" -x sd 'old' 'new' {}
      
      # By filename pattern
      fd 'config' -e json -x sd '"dev"' '"prod"' {}
      ```
      
      ### Multiple Replacements
      
      ```bash
      # Chain with &&
      sd 'pattern1' 'replacement1' file.txt && \
      sd 'pattern2' 'replacement2' file.txt && \
      sd 'pattern3' 'replacement3' file.txt
      
      # Or use a script
      #!/bin/bash
      files=$(rg -l 'oldApi' src/)
      for file in $files; do
          sd 'oldApi\.get' 'newApi.fetch' "$file"
          sd 'oldApi\.post' 'newApi.send' "$file"
          sd 'oldApi\.delete' 'newApi.remove' "$file"
      done
      ```
      
      ## Special Characters
      
      ### Escaping Reference
      
      | Character | Escape | Example |
      |-----------|--------|---------|
      | `.` | `\.` | `sd '1\.0' '2.0'` |
      | `*` | `\*` | `sd '\*important\*' '**important**'` |
      | `?` | `\?` | `sd 'what\?' 'what!'` |
      | `[` `]` | `\[` `\]` | `sd '\[x\]' '[✓]'` |
      | `(` `)` | `\(` `\)` | `sd 'func\(\)' 'func(arg)'` |
      | `{` `}` | `\{` `\}` | `sd '\{0,1\}' '?'` |
      | `$` | `\$` | `sd '\$100' '€100'` |
      | `^` | `\^` | `sd '\^note' 'NOTE'` |
      | `\` | `\\` | `sd '\\n' '\n'` |
      | `\|` | `\|` | `sd 'a\|b' 'a or b'` |
      
      ### Literal Mode
      
      ```bash
      # When you have many special chars, consider preprocessing
      # or use fixed-string replacement with rg first
      
      # For checking matches
      rg -F '[TODO]' src/
      
      # sd doesn't have -F, so escape carefully
      sd '\[TODO\]' '[DONE]' src/**/*.md
      ```
      
      ## Platform-Specific
      
      ### With Git
      
      ```bash
      # Only changed files
      sd 'old' 'new' $(git diff --name-only)
      
      # Staged files only
      sd 'old' 'new' $(git diff --cached --name-only)
      
      # Files changed in last commit
      sd 'old' 'new' $(git diff-tree --no-commit-id --name-only -r HEAD)
      ```
      
      ### In Docker
      
      ```bash
      # Inside container
      docker exec -it container sd 'old' 'new' /app/config.json
      
      # Or with volume mount
      docker run -v $(pwd):/data alpine sh -c "apk add sd && sd 'old' 'new' /data/file.txt"
      ```
      
      ## Tips and Best Practices
      
      | Tip | Reason |
      |-----|--------|
      | Always preview with `rg -r` first | Catch mistakes before applying |
      | Use git before bulk changes | Easy rollback with `git checkout` |
      | Quote patterns | Prevent shell interpretation |
      | Use `\b` for word boundaries | Avoid partial matches |
      | Start specific, then broaden | Easier to control scope |
      | Test on single file first | Verify pattern works |
      | Use `fd -x` for file selection | More precise than globs |
      
  • scripts
    • .gitkeep 0 B · in bundle
  • SKILL.md 2.1 KB
    ---
    name: find-replace
    description: "Modern find-and-replace using sd (simpler than sed) and batch replacement patterns. Triggers on: sd, find replace, batch replace, sed replacement, string replacement, rename."
    license: MIT
    compatibility: "Requires sd CLI tool. Install: brew install sd (macOS) or cargo install sd (cross-platform)."
    allowed-tools: "Bash"
    metadata:
      author: claude-mods
    ---
    
    # Find Replace
    
    Modern find-and-replace using sd.
    
    ## sd Basics
    
    ```bash
    # Replace in file (in-place)
    sd 'oldText' 'newText' file.txt
    
    # Replace in multiple files
    sd 'oldText' 'newText' *.js
    
    # Preview without changing (pipe)
    cat file.txt | sd 'old' 'new'
    ```
    
    ## sd vs sed
    
    | sed | sd |
    |-----|-----|
    | `sed 's/old/new/g'` | `sd 'old' 'new'` |
    | `sed -i 's/old/new/g'` | `sd 'old' 'new' file` |
    | `sed 's#path/to#new/path#g'` | `sd 'path/to' 'new/path'` |
    
    **Key difference:** sd is global by default, no delimiter issues.
    
    ## Common Patterns
    
    ```bash
    # Variable/function rename
    sd 'oldName' 'newName' src/**/*.ts
    
    # Word boundaries (avoid partial matches)
    sd '\boldName\b' 'newName' src/**/*.ts
    
    # Import path update
    sd "from '../utils'" "from '@/utils'" src/**/*.ts
    
    # Capture groups
    sd 'console\.log\((.*)\)' 'logger.info($1)' src/**/*.js
    ```
    
    ## Safe Batch Workflow
    
    ```bash
    # 1. List affected files
    rg -l 'oldPattern' src/
    
    # 2. Preview replacements
    rg 'oldPattern' -r 'newPattern' src/
    
    # 3. Apply
    sd 'oldPattern' 'newPattern' $(rg -l 'oldPattern' src/)
    
    # 4. Verify
    rg 'oldPattern' src/  # Should return nothing
    git diff              # Review changes
    ```
    
    ## Special Characters
    
    | Character | Escape |
    |-----------|--------|
    | `.` | `\.` |
    | `*` | `\*` |
    | `[` `]` | `\[` `\]` |
    | `$` | `\$` |
    | `\` | `\\` |
    
    ## Tips
    
    | Tip | Reason |
    |-----|--------|
    | Always preview with `rg -r` first | Avoid mistakes |
    | Use git before bulk changes | Easy rollback |
    | Use `\b` for word boundaries | Avoid partial matches |
    | Quote patterns | Prevent shell interpretation |
    
    ## Additional Resources
    
    For detailed patterns, load:
    - `./references/advanced-patterns.md` - Regex, batch workflows, real-world examples
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related