Skip to content

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

s/pattern/replacement/flags
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:

sed 's|/old/path|/new/path|g' file.txt
sed 's#pattern#replacement#g' file.txt

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