Files
2025-07-01 12:59:01 +00:00

210 lines
4.5 KiB
Markdown

# **The Sed Mastery Guide: From Basics to Advanced Text Alchemy**
## **Table of Contents**
1. [Sed Fundamentals](#1-sed-fundamentals)
2. [Pattern Addressing](#2-pattern-addressing)
3. [Advanced Substitutions](#3-advanced-substitutions)
4. [Multi-Command Scripts](#4-multi-command-scripts)
5. [Branching & Flow Control](#5-branching--flow-control)
6. [Real-World Recipes](#6-real-world-recipes)
7. [Performance & Limitations](#7-performance--limitations)
---
## **1. Sed Fundamentals**
### **Core Syntax**
```bash
sed [OPTIONS] 'COMMAND' file.txt
```
### **Essential Operations**
| Command | Description | Example |
|---------|-------------|---------|
| `s/old/new/` | Substitute first occurrence | `sed 's/foo/bar/'` |
| `s/old/new/g` | Substitute globally | `sed 's/foo/bar/g'` |
| `p` | Print pattern space | `sed -n '1,5p'` |
| `d` | Delete lines | `sed '/error/d'` |
| `i\text` | Insert before line | `sed '3i\New Line'` |
| `a\text` | Append after line | `sed '$a\END'` |
### **Common Flags**
```bash
sed -i '' file.txt # In-place edit (BSD/macOS)
sed -i file.txt # In-place edit (Linux)
sed -n '1,5p' file.txt # Print only lines 1-5
sed -e 'cmd1' -e 'cmd2' # Multiple commands
```
---
## **2. Pattern Addressing**
### **Line Number Targeting**
```bash
sed '5s/foo/bar/' # Only line 5
sed '1,10d' # Delete lines 1-10
sed '$d' # Delete last line
```
### **Regex Patterns**
```bash
sed '/^#/d' # Delete comment lines
sed '/start/,/end/d' # Delete range between patterns
sed '/pattern/!d' # Keep only matching lines
```
### **Special Addresses**
```bash
sed -n '1~2p' # Every 2nd line starting at 1
sed -n '2,${p;n}' # Every other line from line 2
```
---
## **3. Advanced Substitutions**
### **Capture Groups**
```bash
echo "Hello World" | sed 's/\(Hello\) \(World\)/\2 \1/'
# Output: World Hello
```
### **Custom Delimiters**
```bash
sed 's|/usr/local|/opt|g' # Use | instead of /
```
### **Case Conversion**
```bash
sed 's/.*/\L&/' # Lowercase entire line
sed 's/.*/\U&/' # Uppercase entire line
```
### **Conditional Replacement**
```bash
sed '/error/s/foo/bar/' # Only substitute if line contains "error"
```
---
## **4. Multi-Command Scripts**
### **Command Files**
```bash
# script.sed
/error/ {
s/foo/bar/g
p
}
sed -f script.sed file.txt
```
### **Inline Multi-Commands**
```bash
sed -e 's/foo/bar/' -e '/baz/d' file.txt
```
### **Hold Space Operations**
```bash
sed -n '1h; 2,${H;g; s/\n/ /g; p}' # Combine lines 1-N
```
---
## **5. Branching & Flow Control**
### **Basic Branching**
```bash
sed '/start/{:loop; N; /end/!b loop; s/start.*end/replacement/}'
```
### **Labels & Loops**
```bash
sed ':top; /pattern/{N; b top}' # Accumulate until pattern fails
```
### **Conditional Branch**
```bash
sed '/error/{s/foo/bar/; t; s/foo/baz/}' # If first sub worked, skip second
```
---
## **6. Real-World Recipes**
### **CSV Processing**
```bash
sed 's/^\([^,]*\),\([^,]*\)/\2,\1/' data.csv # Swap first two columns
```
### **Log File Cleaning**
```bash
sed -E '/^(DEBUG|TRACE)/d; s/[0-9]{4}-[0-9]{2}-[0-9]{2}/DATE_REDACTED/g' app.log
```
### **HTML/XML Processing**
```bash
sed '/<script/,/<\/script>/d' page.html # Remove script tags
```
### **Code Refactoring**
```bash
# Rename function and all calls
sed -i 's/old_func_name/new_func_name/g' *.py
```
---
## **7. Performance & Limitations**
### **Large File Handling**
```bash
sed -n '1,1000000p' huge.log > sample.log # Extract first million lines
```
### **When Not to Use Sed**
- JSON/XML with nested structures (use `jq/xmllint`)
- Multi-line records spanning variable lines (use `awk`)
- Binary file editing (use `xxd + sed + xxd -r`)
### **Performance Tips**
```bash
LC_ALL=C sed ... # 2-3x speedup for ASCII
sed ':a;N;$!ba;s/\n//g' # Slurp entire file (careful with memory)
```
---
## **Pro-Level Techniques**
### **In-Place Editing Backup**
```bash
sed -i.bak 's/foo/bar/' file.txt # Creates file.txt.bak
```
### **Non-Greedy Matching**
```bash
sed 's/foo\(.*\?\)bar/\1/' # Perl-style regex (requires -r/-E)
```
### **Random Line Selection**
```bash
sed -n "$RANDOM"' {p;q}' # Get one random line
```
---
## **Sed + Awk Power Combo**
```bash
# Extract columns from lines matching pattern
sed -n '/pattern/p' file | awk '{print $2,$4}'
```
For complex text transformations, consider combining sed with:
- `awk` for columnar data
- `perl` for advanced regex
- `grep` for filtering
**Need a custom sed solution?** Provide your text transformation challenge!