SED

SED - Stream editor

Pattern flags

sed 's/search/replace/flag'

SED picks up each line, strips the end of line char before processing.

g -> global

I -> case invariant

w -> save file. Needs file name

p -> print the modified line

d -> Delete the line

!p -> inverse print

!d -> inverse delete

SED special chars

SED uses Basic Regular Expression (BRE). The following special chars needs to be escaped to make them literal strings.

$ . * / [ \ ] ^

In replacement string "&" also needs to be escaped.

Pattern occurrence

SED has a feature to work on the occurrence of the pattern instead of first or global.

E.g.: Replace only the second "hello" with "hi"


echo "hello hello hello" | sed 's/hello/hi/2'


Output: hello hi hello

Filter before search and replace

To filter the lines before performing an operation, we can use the '//' before 's///'

E.g.: Replace the word "v1" with "v2" in lines that start with "#"


sed '/^#/ s/v1/v2/g'


sed '\,^#, s/v1/v2/g'


Note: If a expression start with a '\' the next character is the delimiter

sed '\_/usr/local/bin_ s_/usr/local_/common/all_'

Range

Specify a range in the file to operate on.


Line number based: sed '1,100 s/search/replace/'

Pattern based : sed '/start/,/end/ s/search/replace/'

Mixed : sed '1,/stop/ s/search/replace'

Invert range : sed '/start/,/end/ !{s/search/replace/}'

Modifiers


Append line after the line containing pattern


echo "abc abc abc" | sed '/abc/ a def'


Output:

abc abc abc

def


Insert a line before the line containing pattern

echo "abc abc abc" | sed '/abc/ i def'


Output:

def

abc abc abc


Change any line containing pattern


echo "abc abc abc" | sed '/abc/ c def'


Output:

def

SED - Few tips

1. SED needs the regex metachars to be escaped i.e. for grouping \(..\) needs to be used

2. SED grouped content is held in \1, \2 etc variables

3. SED -i switch can be used to edit file in-line