Create a text file that contains a set of sed commands that perform the following actions. The files to be edited will be found in '/home/hopper/berezin/Data'. Your command file look something like:

      #!/bin/bash

      dir=/home/hopper/berezin/Data
      psef=/home/hopper/berezin/Data/psef
      passwd=/home/hopper/berezin/Data/passwd
      etcList=/home/hopper/berezin/Data/etcList
      etcSlist=/home/hopper/berezin/Data/etcSlist

      # problem 01 - change the first occurrence of a to b
      sed 's/a/b/' $passwd > sout.01

      # problem 02 - change 2nd occurrence of x to y
      sed 's/x/y/2' $passwd > sout.02

      ... etc

where sout has the problem number appended to it for each problem.

Each problem should include one or more comment lines explaining what you are doing.

You can change the contents of the data variable if you wish to run the sed commands on your own data set. But set it back before handing in the assignment. You can test the results of your 1st 7 solutons by using my data set and using diff to compare the souts files generated by solutions which can be found in '/home/hopper/Sed'.

Create a function, similar to the one outlined in the grep assignment, that invokes diff and compares my answers to yours.

      function sdiffit () {
      'diff sout.$1 /home/hopper/berezin/Sed/sout.$1
      }

Unless stated otherwise, when a string is generically described as a word, treat a word as alpha, numeric, and underscore. If specific word given, treat as literal unless otherwise specified. If it says find the word dog, look for lower case "dog" unless the problem indicates otherwise.

Keep in mind, the passwd file uses a : as a field delimiter.

Write a complete sed statement that edits the specified file. Different problems use different data files. Use the appropriate variable to reference the appropriate file. You may use multiple -e options. But unless specified, do not use any other sed options.


sout.01 Substitute the user Id, root at the beginning of the line in the psef file with Master.


sout.02 In the passwd file, substitute the portion of the home directory field that that says /home/hopper with /system/tron. Do this without using the backslash.


sout.02b Chane /var/lib to /usr/lib in the shell field, last field. There is an entry in the home field that also has /var/lib, so you need to specificly target the right field.


sout.03 In the passwd file, locate users who are daemons. This is usually signifed by the user Id ending with a d, such as printd, sshd, etc.

Once that line has been identified, append :daemon to the end of the line.

So :
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin Will look like :
sshd:x:114:65534::/var/run/sshd:/usr/sbin/nologin:daemon

Remember : separate fields in the passord file, so using square brackets and the not, [^:], is useful.


sout.04 Copy the user Id, the 1st word/column of the line to the end of the line preceeded by a space, :, and space. Use psef

So :
z1763923 10584 10583 0 09:39 pts/24 00:00:00 -bash

Will look like :
z1763923 10584 10583 0 09:39 pts/24 00:00:00 -bash : z1763923

Check out \(\) and &. Parentheses are numbered from the left and they may be embedded. \(\(...\)....\) is legal.


sout.05 Change the 2nd occurrence of the word root in etcList to wheel.


sout.06 In the file, etcSlist, one of the columns is separated by at least 24 spaces, replace the 24 spaces with 4 spaces. Use the brace range, \{\}.


sout.06a In the file, etcSlist, target lines that only have exactly 24 spaces and and shorten that field to 4 spaces. Use the brace range, \{\}. Use adress/match filter to pick line.


sout.06b In the file, etcSlist, target lines that only have exactly 24 spaces and and shorten that field to 4 spaces. Use the brace range, \{\}. Don't use adress/match filter to pick line.


sout.07 Use -n option with sed and print only lines from passwd where the user Id, 1st column, is 4 to 6 characters long.