Table of contents
sed
general form
sed [range from](,[range to])?[command]
syntax
a # match the letter a
\. # match a literal dot '.'
\\ # match backslash
\t # match tab
\n # match newline
\r # match carriage return
^ # match start of pat space
$ # match end of pat space
. # match any character
[0-9] # match digit
\s # match whitespace
\w # match [a-zA-Z0-9_] (word character)
\W # match [^a-zA-Z0-9_] (non-word character)
\b # match word boundary
\B # match non-word boundary
\< # match start of word
\> # match end of word
\| # logical or (alternative pattern)
multiplicity
* # zero or more
\? # zero or one
\+ # one or more
\{n\} # exactly n matches
\{n,\} # n or more matches
\{,n\} # zero to n matches
\{n,m\} # n to m matches
capturing
\( # open capturing group
\) # close capturing group
\n # refer to captured group [n]
& # refer to complete pattern captured
addresses
$ # last line
n # line number n
+n # in upper bound: plus the next n lines (gnu extension)
n~m # on line number n and re-execute every m lines after n
! # inverse addresses
change case
\l # next char to lower case
\u # next char to upper case
\L # next span to lower case
\U # next span to upper case
\E # end case changes for rest of span
special cases in character classes
[]] # match closing bracket ']'
[^]] # match anything but closing bracket
[-] # match a literal dash '-'
[^-] # match anything but a dash
command index
a = append
b = branch
c = change text
d = delete lines
D = delete first line (in patspace)
e = execute on the command line
g = copy from holdspace
G = append from hold space
h = copy to hold space
H = append to hold space
i = insert
l = print substitute line feeds
n = next input line
N = append next input line
p = print
P = print first line
q = quit
Q = quit immediately
r = read file
R = read line from file
s = substitute
t = test for substitution
T = test for no substitution
y = simple character replace
w = write to file
W = write line to file
z = clear line (zap)
= = print line number
:[label] = define label
delete
syntax of delete command
(a1(,a2)?)?!?d
delete lines at specified address (line number or line matching pattern)
[address] d
delete lines from address1 to address2
[address1],[address2] d
substitution command
replace file contents & dump to console
sed 's/[pattern]/[replacement]/g' [file]
substituting & write back to another file
sed 's/[regex]/[replacement]/g' [inputFileName] > [outputFileName]
substituting in original file
sed -i 's/[regex]/[replacement]/' [file]
wildcards can be used to modify multiple files in place
sed -i 's/[regex]/[replacement]/' *.[extension]
easier to read/write patterns => ?, {, }, (, ) and | no longer require '\' escaping
sed -r 's/[regex]/[replacement]/' [file]
substitution with address (ranges)
substitute on line(s) matching [n]
sed '[n]s/[search]/[replace]/g'
apply replacement on lines [n] to [m]
sed '[n],[m]s/[search]/[replace]/g'
substitution flags
i = ignore case
g = replace all occurrences (instead of first only)
n = replace the specified occurrence by index (among all matches)
p = print on match
w = write matches to file (must be last flag)
e = execute pat space on command line (gnu extension)
m = multi line matching mode
write to file alternatives
sed -n '/[pattern]/[replacement]/w [file out]' [file in]
sed -n '/[pattern]/[replacement]/' [file in] > [file out]
chaining sed commands
chaining sed commands with -e or ';'
seq 5 | sed -e 2d -e 4d
seq 5 | sed '2d; 4d'
piping sed
[command] | sed [sed expression]
address ranges
general form
sed [range from](,[range to])?[command]
perform command at line [n]
sed [n][command]
perform command at all lines EXCEPT [n]
sed [n]![command]
perform command from line [n] to [m] inclusive
sed [n],[m][command]
perform command everywhere EXCEPT lines [n] to [m]
sed [n],[m]![command]
repeat command every [r] lines starting at [n]
sed [n]~[r][command]
apply multiple statements to address range by grouping with '{' and '}'
sed '[n]{[statement];[statement]}'
sed '[n],[m]{[statement];[statement]}'
examples
substitution
replace first a with b
sed 's:a:b:'
replace all a's with b's
sed 's:a:b:g'
replace first character (any) with an x
sed 's:.:x:'
replace first literal dot '.' with x
sed 's:\.:x:'
replace first zero or more a's with a single b
sed 's:a*:b:'
replace first digit with an x
sed 's:[0-9]:x:'
replace the numbers 2,3,6 & 7 with an x
sed 's/[2-36-7]/x/'
sed 's/[2-3]\|[6-7]/x/'
sed -r 's/[2-3]|[6-7]/x/'
replace numbers of at least 3 digits with xxx
sed 's/[0-9]\{3,\}/xxx/g'
sed -r 's/[0-9]{3,}/xxx/g'
replace tabs with 4 spaces
sed 's/\t/ /'
end path with sindle trailing slash
sed -e 's:/*$:/:'
increment numbers
sed 's/[0-9]\+/expr 1 + &/e'
sed -r 's/[0-9]+/expr 1 + &/e'
capturing
keep only the first character
sed 's:\(.\).\+:\1:'
sed -r 's:(.).+:\1:'
swap the first 2 characters
sed 's:\(.\)\(.\):\2\1:'
sed -r 's:(.)(.):\2\1:'
capture entire line with ampersand (&)
seq 5 | sed 's/.*/& sucks/'
deleting
delete line number 2
sed 2d
delete last line
sed '$ d'
delete line 2 to 6
sed 2,6d
delete line 2, 5, 8, 11, etc. (gnu extension)
sed '2~3d'
keep line 2, delete the rest
sed '2!d'
deleting blank lines
sed '/^ *$/d' input.txt
delete any line containing a 0 or 5 and the 2 lines after it (gnu extension)
sed '/[05]/,+2d'
delete first occurrence of foo
foo="bar"
sed "1,/$foo/{/$foo/ d}"
insert
insert [text] at line #1 (and append the rest of the file)
sed "1i[text]"
branching
print input endlessly
echo endless | sed ':start;p;bstart'
substitute only on lines containing a 5
sed '/5/!b;s/[0-9]*/five/'
replace all tabs at the beginning of a line with spaces
sed -ri ':start;s/^( *)\t/\1 /;tstart' file
address ranges
extract chunk starting at pattern
sed -n '/[pattern]/,$p' # print first pattern match
sed '0,/[pattern]/d' # print from line after first match
extract chunk until pattern:
sed '/[pattern]/q' [file]
sed '/[pattern]/,$ d' [file]
extract chunk from pattern until pattern
sed -n '/[pattern]/,/[pattern]/p' [file]
extract line numbers 120 to 140
sed -n 120,140p [file]
use +[number] for m to specify lines relative to [n], example: extracting line 3 to 5
sed -n '3,+2p' [file]
delete every other line
sed 2~2d [file]
a dollar refers to the last line, example: counting new lines in file:
sed -n "$=" [file]
perform multiple substitutions on line 1 to 3
sed '1,3{s/apple/pear/;s/pineapple/banana/;/grapefruit/d}'
upper / lower case
upper case the first letter on every line
sed 's/[a-z]/\u&/'
upper case the first word on every line
sed 's/\w\+/\U&/'
repeat line upper case, input case and finally lower case
sed 's/.*/\U& \E& \L&/'
tutorials
http://sed.sourceforge.net/grabbag/tutorials/sedfaq.txt
https://www.gnu.org/software/sed/manual/sed.html
http://www.grymoire.com/Unix/Sed.html#uh-5