Sed Cheat Sheet¶
Stream editor — transform text line by line without opening a file.
Basic Syntax¶
sed [OPTIONS] 'COMMAND' [FILE...]
sed -n 'COMMAND' [FILE...] # suppress default output
sed -i 'COMMAND' FILE # edit in place (GNU)
sed -i.bak 'COMMAND' FILE # in place with backup (both GNU and BSD)
The Substitution Command¶
| Flag | Meaning |
|---|---|
g |
Replace all occurrences (global) |
i |
Case-insensitive |
2 |
Replace 2nd occurrence only |
p |
Print modified lines (use with -n) |
sed 's/old/new/' # replace first occurrence per line
sed 's/old/new/g' # replace all occurrences per line
sed 's/old/new/gi' # case-insensitive, all occurrences
sed 's/old/new/2' # replace 2nd occurrence per line
sed 's/http:/https:/g' urls.txt
Using & (matched text) in replacement¶
echo "hello" | sed 's/hello/[&]/'
# [hello]
echo "2024-01-15" | sed 's/[0-9][0-9][0-9][0-9]/(&)/'
# (2024)-01-15
Alternate delimiters¶
When pattern contains /, use another delimiter:
Addressing (which lines to operate on)¶
sed '3s/old/new/' # only line 3
sed '3,7s/old/new/' # lines 3 through 7
sed '$s/old/new/' # last line only
sed '/pattern/s/old/new/' # only lines matching pattern
sed '/start/,/end/s/x/y/' # lines between start and end patterns
Deleting Lines¶
sed '3d' # delete line 3
sed '3,7d' # delete lines 3 to 7
sed '/^#/d' # delete comment lines
sed '/^$/d' # delete blank lines
sed '/^$/d; /^#/d' # delete both (chained commands with ;)
Printing (with -n)¶
sed -n '5p' # print only line 5
sed -n '5,10p' # print lines 5-10
sed -n '/error/p' # print lines containing "error"
sed -n '$p' # print last line
Insert, Append, Change¶
sed '3i\inserted before line 3' file.txt
sed '3a\appended after line 3' file.txt
sed '3c\this replaces line 3' file.txt
Common Recipes¶
# Remove trailing whitespace
sed 's/[[:space:]]*$//' file.txt
# Remove leading whitespace
sed 's/^[[:space:]]*//' file.txt
# Remove both leading and trailing whitespace
sed 's/^[[:space:]]*//; s/[[:space:]]*$//' file.txt
# Uncomment a line
sed 's/^# *//' file.txt
# Add comment to specific lines
sed '5,10s/^/# /' file.txt
# Extract content between tags
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/p' page.html
# Double-space a file
sed 'G' file.txt
# Number lines
sed '=' file.txt | sed 'N; s/\n/\t/'
# Reverse line order (GNU sed)
sed -n '1!G; h; $p' file.txt
# In-place: update config value
sed -i "s/^PORT=.*/PORT=8080/" config.ini
-i on macOS
BSD sed (macOS) requires a backup extension with -i: sed -i '' 's/old/new/' file. GNU sed (Linux) allows sed -i 's/old/new/' file. Use -i.bak on both for portable scripts.
Related: grep, awk, pipes-redirection