====== Sed Stuff ======
I use this a lot in my scripts - it is about time I keep a proper reference page for it.
====== Basic Manipulation ======
Append specific line
sed '1a this_line' test.txt
Remove all comments before 'start' and after 'stop' lines
sed -e '1,/start/ s/#.*//' -e '/stop/,$ s/#.*//'
Insert text ''this_line'' in file ''test.txt'' //**BEFORE**// a match (e.g. line starting with ''find=''). //**Note**: use -i to actually change the file// sed '/^find=.*/i this_line' test.txt
Insert text ''this_line'' in file ''test.txt'' //**AFTER**// a match (e.g. line starting with ''find=''). sed '/^find=.*/a this_line' test.txt
Insert text ''this_line'' in file ''test.txt'' //**IN-PLACE**// of a match (e.g. line starting with ''find=''). sed 's/^find=.*$/this_line/' test.txt
====== Slightly Advanced ======
Modify the line //**AFTER**// a match
sed '/^find=.*/!b;n;s/^\(.*\)=\(.*\)$/\1=changed/' test.txt
//**Note** The ''!b'' tells sed to break current processing and ''n'' starts the next line//
Prints lines in between two lines starting with ''-- CLUS'' (excluding matching lines)
sed -n "/^-- CLUS:{$pick/,/^-- CLUS/{/^-- CLUS/!p}" test.txt
//more... coming soon...//
===== Sed codes =====
Dumped
sed
: # label
= # line_number
a # append_text_to_stdout_after_flush
b # branch_unconditional
c # range_change
d # pattern_delete_top/cycle
D # pattern_ltrunc(line+nl)_top/cycle
g # pattern=hold
G # pattern+=nl+hold
h # hold=pattern
H # hold+=nl+pattern
i # insert_text_to_stdout_now
l # pattern_list
n # pattern_flush=nextline_continue
N # pattern+=nl+nextline
p # pattern_print
P # pattern_first_line_print
q # flush_quit
r # append_file_to_stdout_after_flush
s # substitute
t # branch_on_substitute
w # append_pattern_to_file_now
x # swap_pattern_and_hold
y # transform_chars
sed -n '/^\[[0-9]*\]$/{h;:l;n;s/^$//;td;s/^{[0-9]*}$//;td;H;bl;:d;x;p;q}'
sed -n '/^\[[0-9]*\]$/{h};/^{[0-9]*}$/{x;p;x;p}'
sed -n '/^\[[0-9]*\]$/{h};/^{[0-9]*}$/{x;s/\n/ /g;Ts;p;s/^\(\[[0-9]*\]\).*$/\1/;:s;G;x;d};/^$/{x;s/\n/ /g;p;d};${x;s/\n/ /g;p;d};/^@/{H};/^#/{H};/^+/{H}'
====== My old notes - will sort this later ======
# convert text file into c string
sed -e 's/\\/\\\\/g;s/"/\\"/g;s/\t/\\t/g;s/^/"/;s/$/\\n"/'
# something else... with explanation
sed -n '/## Screensh/,/##/{/Scree/{p;n};/##/{q};p}' file
-n -> not print
'/## Screen/, /##/ -> match range, I guess you knew it already
{ -> if in this range
/Scree/ -> and line matches /Screenshot/
{p;n}; -> do print line, and read next row (skip doing rest processing)
/##/ -> if line matches "##"
q; -> quit, we have done all printing
p -> if we come to here, print the line
}