CS 279 - Week 12 Lecture 1 - 2022-11-07
TODAY WE WILL
* announcements/reminders
* intro to sed
* [did not get to] [if time] a little more you can do with
Bash command history
* prep for next class
* example solutions for Homeworks 4-7 *should* be reachable
for Exam 2 study purposes
* Exam 2 - this Wednesday - November 9
* IF you'd like the Exam 2 BONUS --
submit that scan of your HANDWRITTEN Exam 2 Review Sheet
by 9:00 am on Wednesday
=====
intro to sed
=====
* stream editor...!
* sed applies a fixed set of editing changes
to a file or sequence of files --
allows you to modify streams of test on the fly;
* written in 1973 or 1974 by Lee McMahon
* basic work cycle:
1. read an entire line from standard input into its
pattern buffer
2. modify the pattern buffer according to the supplied
commands
3. print the resulting pattern buffer to standard out
* expects BREs unless you use option -E
* basic syntax:
sed -e desired_script file1 file2 ...
sed -f desired_script_file file1 file2 ...
desired_script: script of editing commands
file1 file2 ... : a list of files to be edited
desired_script_file: a file with the sed script commands
* one of the sed commands that can be in a sed script
is s, for substitute
s/pattern_to_subst/what_to_subst/
this substitutes what_to_subst for the FIRST instance
matching pattern_to_subst in each line of the files in the
given file list
* SO: a first example:
sed -e 's/UNIX/Linux/' unix-stuff.txt
* substitutes Linux for the first UNIX in each line of unix-stuff.txt,
and outputs the result to the screen
* there can be commands at the END of the sed script --
a popular one is g, global, saying you want ALL of that
matching instances in each line to have the specified change
made
sed -e 's/UNIX/Linux/g' unix-stuff.txt
* substitutes Linux for every UNIX in each line of unix-stuff.txt,
and outputs the result to the screen
sed -e 's/#.*//' clicker-rematch.sh
=====
selectors in sed commands
=====
* you can specify WHICH lines in a file to edit;
you use a selector for that.
* selector: an "address" or pair of "addresses"
that specify the lines to be potentially affected
"address": a line number or a BRE
(and the RE is usually in // although it CAN be delimited by
other characters as well)
* a command is executed only if it is selected/if its selector
is satisfied
* a few examples:
sed -e '3,5s/#.*//' clicker-rematch.sh
...should replace the comments with empty just on lines 3-5 in
unix-stuff.txt
sed -e '/^if/,/fi/s/\(.*\)/# MOO\1/' clicker-rematch.sh
...just puts # MOO in front of each line in a top-level if
within clicker-rematch.sh
a few more patterns:
/walrus/,/oyster/ # selects groups of lines that start with
# a line containing walrus and ends with
# one containing oyster
3,/oyster/ # selects line 3 up to and including the
# next line containing oyster
# (or all the rest of the lines if none
# have oyster...)
* if you give just one selector, lines matching that will be
affected
# substite foo with bar ONLY
# for lines containing baz
sed -e '/baz/s/foo/bar/g' foodiebar.txt
* you can put ! at the end of selector to
say select the lines that DON'T match this --
# substite foo with bar ONLY
# for lines NOT containing baz
sed -e '/baz/!s/foo/bar/g' foodiebar.txt
# hey, you can have a blank between the selector and the command!
sed -e '/baz/! s/foo/bar/g' foodiebar.txt
=====
sed flags
=====
* more options you can add to the end of the script/command
of a sed statement:
* we've seen g:
sed -e 's/foo/bar/g' *.txt # all the foo in each line become bar
* put a number n at the end, just the nth instance is substituted
sed -e 's/foo/bar/2' *.txt # the 2nd foo in each line become bar
* there IS a delete command, also: d
# should delete blank lines in clicker-rematch.sh
sed -e '/^$/d' clicker-rematch.sh
sed -e 's/#.*//' clicker-rematch.sh | sed -e '/^$/d'