eL0 9 #next 1.1a 10 L1.1a 8 A#print This program will try to help you learn how to use the editor. You should really know, before starting this, how to use files and how to type. There is a "learn files" procedure to teach you about files. Just to review, the current directory contains some files whose name begins with "do"; they describe something you should do. Find out what, do that, and then type "ready". #create ohio #create do1 There is a file in this directory named for a state. #create do2 Change the name of that file to 'iowa'. #user test ! -r ohio && test -r iowa #log #next 2.1a 1 2.2a 10 tL10.1a J 6#print Often, what you want to do is print an entire file, and often you don't know exactly how long it is. There is a special abbreviation for this purpose: the character $ refers to the last line in the file, and so 1,$p prints all of a file. Here's a new file. Print it out using the editor command 1,$p. Then do the usual w, q, and ready. #create Ref 1,$p w q #create file New York Mets Managers Casey Stengel Wes Westrum Gil Hodges Yogi Berra Roy McMillan #copyin #pipe ed file #user #unpipe #uncopyin tail -3 .copy >X1 #cmp X1 Ref #log #next 10.1b 10 L10.1b @3 #print You can of course combine the various sorts of line addresses we have been using. Suppose the last line is line 6; then $ is line 6, and $-1 is line 5. Thus $-1 is the next to last line, and 1,$-1p prints all but the last line of a file. Again, I'll put you in the editor: print the last three lines of the file. End with the usual w, q, and ready. #create Ref Gil Hodges Yogi Berra Roy McMillan 89 #create file New York Mets Managers Casey Stengel Wes Westrum Gil Hodges Yogi Berra Roy McMillan #copyout #pipe ed file #user #unpipe #uncopyout tail -4 .ocopy >X1 #cmp X1 Ref #fail I hope you realized the addresses had to be $-2,$p to get the last three lines. #cmp X1 Ref #log #next 11.1a 10 11.2a 5 L10.2a L e#print Often you want to refer to the last line of a file, and you don't know how long it is. There is a special address, "$" for this purpose. "$" refers to the end of a file. Thus $p prints the last line of a file and 1,$p prints all of a file. Here's another file. Print all of it, and then type the usual w, q, and ready. Your commands should look like 1,$p w q ready #create Ref 1,$p w q #create file New York Mets Managers Casey Stengel Wes Westrum Gil Hodges Yogi Berra Roy McMillan #copyin #pipe ed file #user #unpipe #uncopyin tail -3 .copy >X1 #cmp X1 Ref #log #next 10.1b 10 10.2b 5 sL10.2b M #print You can of course use "$" with other addresses. For example, print from the third line of this file through the end; then leave with the usual w, q, and ready. #create Ref IBM Sperry Rand Univac Control Data Honeywell 80 #create file Burroughts National Cash Register IBM Sperry Rand Univac Control Data Honeywell #copyout #pipe ed file #user #unpipe #uncopyout tail -5 .ocopy >X1 #cmp X1 Ref #log #next 10.3c 2 10.2c 5 10.1b 10 L10.2c 7C n#print And you can also use other kinds of addresses with the "$" address. For example, you can use ".", or combinations with ".", as addresses. Consider printing from the current line to the end of the file - what would the "p" command look like? Type "answer COMMAND" where "COMMAND" is that command. #copyin #user #uncopyin #match .,$p #log #next 10.1b 3 10.3a 0 L10.3a N H#print Often you want to refer to the last line of the file. You don't have to know the number of lines in the file to do that; there is a special address, "$", that always refers to the last line. So you can print the last line of a file with $p; try that, then type w, q and ready as usual. #create Ref This is the end of the file and the line you should print. 95 #create file don't print this line or this one This is the end of the file and the line you should print. #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X1 #cmp X1 Ref #log #next 10.3b 5 10.3c 10 L10.3b O #print You can print an entire file making use of the fact that "$" refers to the last line. The command 1,$p prints from the first line to the last one, or the whole file. Try printing this whole file with this command, and then typing w, q and ready. Your commands should look like 1,$p w q ready #create Ref 1,$p w q #create file New York Mets Managers Casey Stengel Wes Westrum Gil Hodges Yogi Berra Roy McMillan #copyin #pipe ed file #user #unpipe #uncopyin tail -3 .copy >X1 #cmp X1 Ref #log #next 10.2b 10 L10.3c (z #print Don't forget the use of arithmetic combinations with the "p" command. For example, the current line is "." and the next line is ".+1"; do you see how to print the current line and the next line with one command? Think of it as "print from this line to the next line". Type "answer COMMAND" where COMMAND is what your line with "p" will look like. #copyin #user #uncopyin #match .,.+1p #match .,+p #match .,+1p #match .,.1p #log #next 10.3d 5 10.1b 10 L10.3d C #print Suppose you wanted to print from the current line to the end of the file? What's the command for that? Again, type "answer COMMAND" where COMMAND is what your line with "p" will look like. #copyin #user #uncopyin #match .,$p #log #next 10.3e 5 10.1b 10 L10.3e <z -#print Again, remember the possibility of arithmetic combinations. If "$" is the last line, what is the line before the last line? Type "answer XXX" where "XXX" is the way you would refer to the line before the last line of the file. #copyin #user #uncopyin #match $-1 #match $- #log #next 10.3f 10 hL10.3f U #print How would you print from the first line of a file to the next to last line (thus printing all but the last line of something)? I'll put you in the editor - do that and then type the usual w, q and ready. #create Ref Boroughs Manhattan Brooklyn Queens the Bronx Staten Island 92 #create file Boroughs Manhattan Brooklyn Queens the Bronx Staten Island Don't print this line! #copyout #pipe ed file #user #unpipe #uncopyout tail -7 .ocopy >X1 #cmp X1 Ref #log #next 10.1b 5 cL11.1a #print By now you are probably wondering how you get into the editor if someone else doesn't put you there. The main command interpreter (the shell) recognizes ed as the name of the editor. (On some systems, it's also called "e", which is a useful abbreviation.) You can give a file name, which becomes the current file. Thus ed NAME in response to $ puts you in the editor with current file as specified by NAME. So you can print a file with the sequence ed file 1,$p w q All right. There is a file in the current directory named for a New Jersey city. Print it with "cat" and then with the editor. Then type "ready". #create Ref 2 cups sifted all-purpose flour 1 tablespoon double-acting baking powder 1/2 teaspoon salt 1/4 cup butter 3/4 cup milk 119 #create trenton 2 cups sifted all-purpose flour 1 tablespoon double-acting baking powder 1/2 teaspoon salt 1/4 cup butter 3/4 cup milk #copyout #user #uncopyout tail -6 .ocopy >X1 #cmp X1 Ref #log #next 12.1a 10 12.2a 5 L11.2a #print So far I have always put you into the editor. How do you get there yourself? The main command interpreter (the shell) recognizes ed as the name of the editor. (On some systems, it is also called "e", which is a useful abbreviation.) You can also say ed file1 which put you in the editor with the current file "file1". So, for example, you can print the last line of a file with ed NAME $p w q where NAME is the name of the file. In this directory is a file named "file45". Print the last line of it, and then exit as above. #create Ref This file contains nothing of great importance and you should not be printing these lines because the only line that you were asked for was this line, the last line. #create file45 This file contains nothing of great importance and you should not be printing these lines because the only line that you were asked for was this line, the last line. #copyout #pipe #user #unpipe #uncopyout grep last .ocopy >X1 tail -1 Ref >X2 #cmp X1 X2 #log #next 11.2b 10 12.2a 5 L11.2b X #print You can clearly print a whole file with e filename 1,$p w q which prints a file, just as "cat filename" does. Print the file "stuff" using the editor. Then type "ready". #create Ref Actually this file is a very short file and prints quickly. 60 #create stuff Actually this file is a very short file and prints quickly. #copyout #pipe #user #unpipe #uncopyout tail -3 .ocopy >X2 #cmp X2 Ref #log #next 11.2c 10 cL11.2c Y #print You can of course execute other shell commands before going into the editor. For example, in this directory there is a file named for a New Jersey city. Find out what file it is; then print it with "cat" and with the editor to check the listings are the same. Then type "ready". #create Ref 2 cups sifted all-purpose flour 1 tablespoon double-acting baking powder 1/2 teaspoon salt 1/4 cup butter 3/4 cup milk #create trenton 2 cups sifted all-purpose flour 1 tablespoon double-acting baking powder 1/2 teaspoon salt 1/4 cup butter 3/4 cup milk #copyout #pipe #user #unpipe #uncopyout grep '....' .ocopy | tail -5 >X1 #cmp X1 Ref #log #next 12.1a 10 12.2a 5 cL12.1a ^#print Each 'w' command typed so far has written the edited material back on the same file that it came from originally. This can be changed by giving a filename on the 'w' command: w camden will write the current editor buffer on file 'camden'. What does the following sequence of commands do? ed old w new q As you can see, it picks up file 'old', and writes it on file 'new'. It has the same effect as cp old new does. This directory contains a file with a name beginning with 'h'. Make a copy of that file named 'norman'. Check the copy by listing the old and new files with 'cat' before you type 'ready'. #create harry Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. #user #cmp harry norman #log #next 12.1b 10 L12.1b [ #print This directory still has both files named 'harry' and 'norman' in it. You checked that they were the same with 'cat'. Now, for an easier time, try 'diff'. If it doesn't report any differences, you can be sure the files are the same. #create harry Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. #create norman Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. Type "ready" when you're done experimenting. #copyin #user #uncopyin grep diff .copy >/dev/null #log #next 13.1a 10 13.2a 5 L12.2a )#print Each 'w' command typed so far has written the edited material back on the same file that it came from originally. This can be changed by giving a filename on the 'w' command: w camden will write the current editor buffer on file 'camden'. What does the following sequence of commands do? ed old w new q As you can see, it picks up file 'old', and writes it on file 'new'. It has the same effect as cp old new does. In this directory there is a file named "old". Copy that file to file "new" with the editor, using the commands given above. Check by printing both files with "cat" that they are the same. Type "ready" when done. #create Ref Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. #create old Four score and seven years ago our fathers brought forth on this continent a new nation, conceived in liberty and dedicated to the proposition that all men are created equal. #user #cmp old new #log #next 12.2b 5 vL12.2b F 9#print Now use the editor to copy file "first" to file "second". Then type "ready". #create Ref Bell Telephone Laboratories 600 Mountain Avenue Murray Hill, New Jersey 07974 #create first Bell Telephone Laboratories 600 Mountain Avenue Murray Hill, New Jersey 07974 #user #cmp Ref second #log #next 12.2c 5 cL12.2c ^ #print Again, you can type various commands before entering the editor. This directory contains a file whose name begins with the letter 'h'. Make a copy of that file named "norman". Check by printing the files, either in the editor or with the "cat" command, that they are the same. Then type "ready". #create harry Pushkin Tolstoy Dostoevsky Chekhov Gorky Pasternak Solzhenitsyn #user #cmp harry norman #log #next 12.1b 10 L13.1a F 2#print Remember we said that you didn't have to know the number of the last line, because '$' could always be used for that. What if you want to know how long the file is? Well, the editor command $= will tell you what '$' is set to, i.e. the number of lines in the file. You can find the number of lines in any file, then, by editing it and then typing "$=". (You then must leave the editor with the usual w,q). How many lines are there in file 'henry'? You may want to check by listing the file with "cat" as well as by using "$=" in the editor. Don't forget to leave the editor with the usual 'w', 'q'; eventually, type "answer N" where N is the number of lines. #create henry Murray Hill Holmdel Whippany Madison Piscataway Chester Warren #copyin #pipe #user #unpipe #uncopyin #match 7 #log #next 14.1a 10 L13.2a e#print Remember that "$" is the last line in the current file. Suppose you want to know how long the file is, i.e. what the number of the last line is. The command $= will tell you that. So you can find the length of the file "data" by saying ed data $= w q Try that; then check by listing the file with "cat" to see how long it is. Then type "ready". #create data This is the file which you should find the number of lines in by typing "$=" in the editor and see that it has exactly nine lines in it when printed. #copyout #pipe #user #unpipe #uncopyout grep 9 .ocopy >/dev/null #log #next 13.2b 5 L13.2b G 8#print How many lines are there in file "henry"? When you find out, leave the editor, and then type "answer N" where N is the number of lines in file "henry". #create henry Murray Hill Holmdel Whippany Madison Piscataway Chester Warren #copyin #pipe #user #unpipe #uncopyin #match 7 #log #next 14.1a 10 14.2a 5 L14.1a #print You can also use the "=" command to find out what the 'current' line is. Since the current line is referred to as '.', do you see that .= is the appropriate command to print the current line number? So if you go through a sequence like 3p .= the second command will print '3'. That's not very exciting, so why don't you edit file 'roger', print the next to last line, and then use '.=' to find out what it is. Don't forget to exit from the editor with w, and then q. Then finish by typing "answer N" where N is what you found, as usual. #create roger this is a short file containing five lines of which this line is next to last indeed #copyin #user #uncopyin #match 4 #log #next 15.1a 10 15.2a 5 L14.2a #print You can also use the "=" command to find out what the 'current' line is. Since the current line is named '.', the appropriate command is .= and so if you say 3p .= the second command will print '3'. Since you should not believe what I tell you without checking it, edit file "doubt" and type the two commands above, which first print line 3 (and incidentally set "." to that line) and then ask what number "." is. Then type w, q, ready. #create doubt you didn't have to print this line you didn't have to print this line to err is human, to really foul things up takes a computer you didn't have to print this line you didn't have to print this line #copyout #user #uncopyout grep 3 .ocopy >/dev/null #log #next 14.2b 5 sL14.2b d #print You can use all kinds of addresses with "=" so that you can find the number of the last line with $= for example. There is a file 'monteverdi' in this directory: find out the number of the next to last line. Then exit from the editor with w, q and type "answer N" where N is the number of the next to last line. #create monteverdi madrigals magnificat a 6 voci mass a 4 voci motets l'orfeo psalms #copyin #user #uncopyin #match 5 #log #next 15.1a 10 15.2a 5 hL15.1a ŗ |#print So far you only know how to copy and print existing files in the editor, and not how to get started from scratch. The 'a' (append) command lets you type in new text. For example, the sequence ed file a this is a new line of text . w q will append the line this is a new line of text to the editor buffer, and then write it on "file". (If "file" doesn't already exist, the editor will warn you, but it's not an error.) Note that the material being added ends with the line that just contains a single '.' and that normal editor commands then resume. Following this pattern, make a file named "pres" that contains the line franklin delano roosevelt and, after you have written it with a 'w' command, and done your 'q', try saying "cat pres" to check that you did it right. Then type "ready". #create Ref franklin delano roosevelt #user #cmp pres Ref #log #next 15.1b 10 L15.1b H :#print You can of course put several lines between the 'a' and the '.' to type in lots of text at one time. Here is a set of lines: type them in and name the file "fruit". Type "ready" when done. Input is ... #create Ref apple peach pear plum nectarine orange #print Ref #user #cmp Ref fruit #log #next 16.1a 10 L15.2a җ #print So far you have learned how to copy and print existing files, and now you probably want to know how to add new text to a file. The "a" (append) command lets you do that. For example, the sequence ed file a A man, a plan, a canal - Panama. . w q will append the line A man, a plan, a canal - Panama. to the editor buffer, and write it on file "file". (If "file" didn't exist already, the editor will warn you. It's not an error, just a warning.) Try that. Then say "cat file" to check what was written, and then type "ready". #create Ref A man, a plan, a canal - Panama. #user #cmp file Ref #log #next 15.2b 5 15.3b 2 L15.2b h #print Now make a file containing the line The Hon. Brendan Byrne and write it on file "gov". Then type "ready". #create Ref The Hon. Brendan Byrne #user #cmp gov Ref #log #next 15.1b 10 eL15.2c cz W#print Note that every set of lines to be appended ends with the character '.' alone on a line. This is essential to get back to editor command level. Whenever you have been appending, and you later type a 'p' or 'w' command and the editor appears not to respond, check that you remember to type the '.' to stop appending. This is a very common error even among experienced users. Suppose you type in, appending to a file, five lines; what must you type on the sixth line before typing 'w'? Type "answer X" where X is that character. #copyin #user #uncopyin #match . #log #next 15.2d 5 15.3d 2 L15.2d i 4#print As we mentioned, you can add several lines at once. Here is a set of lines; go into the editor, append them, write them on a file named "fruit", and then leave the editor and type "ready". #create Ref apple peach pear plum nectarine orange #print Ref #user #cmp Ref fruit #log #next 16.1a 10 15.3e 5 L15.3b ؗ #print You can put several lines betwen the 'a' and the '.', as in this example which creates a file named 'opera'. ed opera a abduction from the seraglio - mozart aida - verdi alcina - handel anna bolena - donizetti . w q Try this as shown. Then type "ready". (Notice the warning that "opera" doesn't exist when you start.) #create Ref abduction from the seraglio - mozart aida - verdi alcina - handel anna bolena - donizetti #user #cmp opera Ref #log #next 15.2c 5 L15.3d k #print Use the editor to make a file named 'pres' and containing the single line franklin delano roosevelt and then type "ready". #create Ref franklin delano roosevelt #user #cmp pres Ref #log #next 15.3e 5 L15.3e k ^#print Remember that after typing the '.' which ends an append you can type ordinary commands at the editor. Go into the editor; append the line washington, d.c. and then print it with the 'p' command. Then write it on a file named "city" and leave the editor and type "ready". #create Ref washington, d.c. #user #cmp city Ref #log #next 15.3f 5 L15.3f I #print Now make a file named "towns" that contains the lines summit chatham westfield cranford madison and print it out to check you did it right. Then type "ready". #create Ref summit chatham westfield cranford madison #user #cmp towns Ref #log #next 16.1a 10 oL16.1a #print When you are typing after an 'append' command, the editor is no longer listening for its ordinary commands. Between 'a' and '.' none of your usual 'p', 'w', or 'q' commands are recognized. The only thing that will make the editor wake up is to type '.' alone on a line. So to type in text, then print it, you must go through a sequence like ed file a input text . 1,$p w q and you must not type the "1,$p" until you have typed the '.'. Do you understand? Will the sequence ed junk a input line $= . w q print the number of the last line typed in? If you don't know, try it. Then type 'yes' or 'no'. #copyin #pipe #user #unpipe #uncopyin #match no #log #next 16.1b 10 16.2a 5 yL16.1b n #print So far you've only appended to empty files. If the file you are appending to has something in it, you have to decide where you want the new material to be placed. You can give a line address with 'a', and the append command will place the new material after that line. For example, 3a input . places 'input' after line 3. What will be the line number of the input line? Type 'answer N', as usual. #pipe #copyin #user #uncopyin #unpipe #match 4 #log #next 16.1c 10 L16.1c o *#print The current directory contains a file named 'hand'. The third line is missing: add the line middle finger after line 2 of this file. Check what you're doing by printing the file with 1,$p before and after the change. Then rewrite the file with the usual w, q, and then type "ready". #create Ref thumb index finger middle finger ring finger little finger #create hand thumb index finger ring finger little finger #create rhand thumb index finger ring finger little finger #pipe #user #unpipe #cmp hand Ref #log #next 17.2a 5 18.1a 10 18.2a 7 L16.2a ( #print So far you have always appended to an empty file, so that there was no problem about where the appended lines were placed in the file. If the file you're appending to already has lines in it, you can say where you want the new material to be placed by giving a line address with 'a', and you can check on this by printing the file. Try the following sequence and note what happens to the new lines that are added with the "3a" command: ed rivers 1,$p 3a merrimack connecticut hudson . 1,$p w q ready #create Ref penobscot androscoggin kennebec merrimack connecticut hudson delaware susquehanna #create rivers penobscot androscoggin kennebec delaware susquehanna #user #cmp rivers Ref #log #next 16.2c 5 L16.2c q #print You can see that the 'a' command adds lines after the line addressed. So if you type 2a at the editor, what will be the line number of the first line that you added? Type "answer N" where N is the number it will have. #copyin #user #uncopyin #match 3 #log #next 16.1c 5 L17.2a r c#print You must always remember what the computer is expecting from you: shell commands, editor commands, or input text after an 'append'. Suppose you are typing append text: what do you type to get back to where you can type editor commands? Type "answer X" where "X" is replaced by what you type. #copyin #user #uncopyin #match . #log #next 17.2b 5 nL17.2b r #print What do you type to go from the editor command level to where you type input text? (The append command). Type "answer X" where X is what you type. #copyin #user #uncopyin #match a #log #next 17.2c 5 tL17.2c z #print What command do you type to go from the shell to the editor? Type "answer X" where X is the command name. #copyin #user #uncopyin #match e #match ed #log #next 17.2d 5 L17.2d t #print And, finally, what is the last line you type to go to the shell from the editor? Again, respond "answer X" where X is the command. #copyin #user #uncopyin #match q #log #next 18.1a 10 18.2a 5 L18.1a u y#print Sometimes it is desirable to add text before a known line, rather than after it. For this purpose there is an 'i' (insert) command that places the new material before the specified line. Otherwise, 'i' is exactly like 'a', so that 3i is the same as 2a Remember the address of the last line? Just before the last line of file 'airlines' insert the line twa and then rewrite the file with w, q, and type ready. #create Ref american braniff continental delta eastern national pan am twa united #create airlines american braniff continental delta eastern national pan am united #user #cmp airlines Ref #log #next 19.1a 10 L18.2a 3 f#print Once in a while you want to add text just before a certain line, rather than just after it. For this purpose there is a command 'i' (insert) which is just like 'a' except that the new material goes before the addressed line, instead of after it. For example, 3i is the same as 2a Try this sequence, which prints the editor buffer before and after the insertion, to see what happens. ed cars 1,$p 3i lincoln chevrolet . 1,$p w q ready #create Ref ford mercury lincoln chevrolet buick pontiac oldsmobile #create cars ford mercury buick pontiac oldsmobile #user #cmp cars Ref #log #next 18.2c 7 18.3a 3 L18.2c z #print Again, remembering that "5i" is the same as "4a" what command is the same as .-1a to the editor? Respond "answer XX" where XX is that command. #copyin #user #uncopyin #match i #match .i #log #next 18.2d 2 18.2e 6 sL18.2d * #print What command will insert lines before the second line from the end of the file? Type "answer XXX" where XXX is that command. #copyin #user #uncopyin #match $-2i #match $-3a #log #next 18.2e 5 L18.2e x l#print Just before the last line of file 'airlines' in this directory insert the line twa and then rewrite the file with w, q, and type "ready". #create Ref american braniff continental delta eastern national pan am twa united #create airlines american braniff continental delta eastern national pan am united #user #cmp airlines Ref #log #next 19.1a 10 19.2a 5 L18.3a y #print Since 'i' is the same as 'a' except for the position of the inserted material, what character must end every block of lines inserted with the 'i' command? Type "answer X" where X is that character. #copyin #user #uncopyin #match . #log #next 18.3b 5 18.2c 10 L18.3b y T#print Remembering that 'i' inserts one line before the 'a' command, so that after 3a the first input line is number 4 while after 3i the first input line is number 3, what command using 'i' is the same as the command 5a to the editor? Type "answer XX" where XX is that command. #copyin #user #uncopyin #match 6i #log #next 18.2c 5 L19.1a z #print Now that you know how to add lines to a file, you will want to know how to get rid of them. The command 5d will delete line 5 of a file. The command .d will delete the current line. In the file 'pres' either the 5th or 6th line is wrong. Print those lines and delete the bad one; then rewrite the corrected file. Then type 'ready'. #create Ref george washington john adams thomas jefferson james madison james monroe john quincy adams andrew jackson martin van buren william henry harrison john tyler #create pres george washington john adams thomas jefferson james madison james monroe this is wrong Qwertyuiop john quincy adams andrew jackson martin van buren william henry harrison john tyler #pipe #user #unpipe #cmp pres Ref #log #next 19.1b 10 L19.1b { #print Just as you can print several lines at once by giving a range of addresses with the 'p' command, you can delete several lines at once by giving two addresses. For example, 2,5d deletes lines 2, 3, 4 and 5 of the current file. The command 1,.-1d deletes all lines up to but not including the current line. And 1,$d deletes EVERY line. (Use with extreme caution, obviously.) There is a file named 'counties' in this directory. Throw away the first five lines of it and rewrite it. Then type 'ready' as usual. #create Ref Morris Warren Union Somerset Hunterdon #create counties Bergen Passaic Sussex Hudson Essex Morris Warren Union Somerset Hunterdon #pipe #user #unpipe #cmp counties Ref #log #next 20.1a 10 20.2a 5 L19.2a ? #print To avoid just accumulating lines forever, you need some way of getting rid of them. The 'd' command (delete) removes lines you don't want. Since it also removes lines that you do want if you tell it to, you should be careful with this command. Deleting one line at a time is always pretty safe. For example 5d will delete line 5 of a file. Try the following sequence; note that I've used "cat" for a change. cat bmt ed bmt 5d w q cat bmt ready #create Ref 14th st 23rd st 28th st 34th st times square 49th st 57th st #create bmt 14th st 23rd st 28th st 34th st 42nd st times square 49th st 57th st #user #cmp bmt Ref #log #next 19.3b 3 19.2c 8 L19.2c M m#print In this directory there is a file "pres" in which either the 5th line or the 6th line does not belong. Edit the file, print the dubious lines, delete the bad one, and then rewrite the file. Then type "ready". #create Ref george washington john adams thomas jefferson james madison james monroe john quincy adams andrew jackson martin van buren william henry harrison john tyler #create pres george washington john adams thomas jefferson james madison james monroe this is wrong Qwertyuiop john quincy adams andrew jackson martin van buren william henry harrison john tyler #user #cmp pres Ref #log #next 19.2d 5 L19.2d z #print You can delete several lines at once by giving a range of addresses with the 'd' command. For example, the sequence ed howto 2,5d w q will delete lines 2 through 5 of the file "howto" and write the shorter material on the file "new". Try that. Then say cat howto cat new to see the differences; then type "ready". #create Ref To use UNIX: 5. dial ext. 4321 6. type userid in response to login 7. type commands #create howto To use UNIX: 1. turn terminal power on 2. check terminal is in "line" mode 3. check duplex switch in "full" position 4. check baud rate at "300" 5. dial ext. 4321 6. type userid in response to login 7. type commands #user #cmp new Ref #log #next 19.2e 5 20.1a 10 oL19.2e z 5#print Now, for comparison, use the "diff" command to check on the differences between "howto" and "new". Try typing diff howto new and then "ready". #create howto To use UNIX: 1. turn terminal power on 2. check terminal is in "line" mode 3. check duplex switch in "full" position 4. check baud rate at "300" 5. dial ext. 4321 6. type userid in response to login 7. type commands #create new To use UNIX: 5. dial ext. 4321 6. type userid in response to login 7. type commands #copyin #user #uncopyin #match diff howto new #match diff new howto #log #next 19.2f L19.2f 0N 9#print There is a file "counties" in this directory. Try deleting the first five lines of the file. Then type "ready". #create Ref Morris Warren Union Somerset Hunterdon #create counties Bergen Passaic Sussex Hudson Essex Morris Warren Union Somerset Hunterdon #user #cmp counties Ref #log #next 20.1a 10 20.2a 5 L19.3b IN #print You can use any other kind of address you want with 'd'; for example, .d will delete the current line. Remember the name of the last line? Pick up file "flower" and delete the last line and rewrite the file. Then type "ready". #create Ref aster chrysanthemum daffodil marigold petunia rose tulip zinnia #create flower aster chrysanthemum daffodil marigold petunia rose tulip zinnia hummingbird #user #cmp flower Ref #log #next 19.2c 10 L2.1a > J#print Now to check that you can type, a line will be typed at you: type it back in, and then type "ready". Type the line exactly as it is typed at you, including the colons that bracket it. : pack my box with five dozen liquor jugs : #copyin #user #uncopyin #match : pack my box with five dozen liquor jugs : #log #next 3.1a 10 L2.2a > #print As an easier typing test, see if you can just get the word "management" in correctly. Type it in response to "$" and then type "ready". #copyin #user #uncopyin #match management #log #next 3.1a 10 L20.1a #print You can now change a line of a file, using only the commands already taught, by deleting the old line and inserting a new one. This is not a very convenient way to do that, so there is a command 'c' (change) which combines those operations. 5c input text here. . will delete line 5 and replace it by the lines input text here. Note that the text following 'c', just like the text after 'i' and 'a', must end with a line containing just one '.' and nothing else. This directory contains a file named 'short' with six lines in it. Change the last line to read new version of last line and rewrite the file; then end with "ready". #create Ref This is a short file which contains exactly six lines of text of which you are to change the last line new version of last line #create short This is a short file which contains exactly six lines of text of which you are to change the last line this is the last line. #pipe #user #unpipe #cmp Ref short #log #next 21.1a 10 gL20.2a #print You can now change a line of a file by a slow procedure: delete the old version and insert the new one. For example, you could replace line 4 of a file with 4d 3a new version of line 4 . right? OK, try that. There is a file named "words" in this directory and line 4 contains a mistyped word. Correct it and rewrite the file; then type "ready". #create Ref bear begin belief believe belt bend #create words bear begin belief beleive belt bend #user #cmp words Ref #log #next 20.2b 5 L20.2b e #print There is an easier way to do that. You can just say 5c input text for new version . using the 'c' command ('c' stands for 'change') which will delete the old version of the line and replace it. Note that the input text after 'c' ends with a '.' just like the text after the 'a' or 'i' commands. This directory contains a file named "lineup". Change the third line to read "neal walk" and print the file before and after. Use a sequence like this, ending in ready: ed lineup 1,$p 3c neal walk . 1,$p w q ready #create Ref walt frazier earl monroe neal walk bill bradley spencer haywood #create lineup walt frazier earl monroe john gianelli bill bradley spencer haywood #user #cmp lineup Ref #log #next 20.2c 5 aL20.2c m 4#print You can also change several lines, and you need not replace lines with the same number of lines. You can put any amount of text between the 'c' command and the closing '.', and you can remove any number of lines from the file by specifying a range of addresses. For example, 2,5c first second . would replace the FOUR lines 2,3,4 and 5 of the file with TWO new lines containing "first" and "second". You can of course use more complicated addresses involving $ and . if you wish. This directory contains a file "oldrr". Delete the last two lines and replace them by a line reading penn central and write the new version on a file named "newrr". Then use "diff" to compare the old and new versions of the file. Eventually, type "ready". #create Ref maine central bangor and aroostook boston and maine grand trunk vermont central boston and albany new haven delaware and hudson new york, susquehanna, and western erie-lackawanna chessie system lehigh valley long island railroad penn central #create oldrr maine central bangor and aroostook boston and maine grand trunk vermont central boston and albany new haven delaware and hudson new york, susquehanna, and western erie-lackawanna chessie system lehigh valley long island railroad new york central pennsylvania #user #cmp newrr Ref #log #next 21.1a 10 L21.1a N ,#print Remember all the basic commands: 'e', 'a', 'w' and 'q'. Make a file named 'test' that contains the following lines, exactly as presented below. Then type "ready". #create Ref maine new hampshire vermont massachusetts rhode island connecticut #print Ref #user #cmp Ref test #log #next 21.1b 5 L21.1b T#print In this directory there is a file 'fix'. It contains a mistyped line. Print the file; then change that line and rewrite the file correctly. Then type "ready". #create Ref Bell System Companies include: American Telephone and Telegraph Company Long Lines Division Western Electric Company Bell Laboratories Teletype Corporation Associated Companies #create fix Bell System Companies include: American Telephone and Telegraph Company Long Lines Division Western Electric Company Bell Lxxxxtories Teletype Corporation Associated Companies #user #cmp Ref fix #log #next 21.1c 5 21.1e 10 L21.1c #print This directory contains a file "list" which has a list of words in it. What word is on the last line of the file? The file is rather long - I'd suggest you not try to print all of it. Type "answer WORD" where WORD is the word on the last line of the file. #create list aardvark adapt addition alert allege alphabet announce answer apple architect arrange avoid this is going to be very boring if you keep trying to print the whole file you should have said $p and I would suggest you hit delete now and try that instead i am very patient and you are not going to like waiting for all of this to go on for ver ... ... .. ... year youth zebra #copyin #user #uncopyin #match zebra #log #next 21.1d 5 yL21.1d D #print How long is file "text"? (That is, how many lines does it have, or what is the line number of the last line.) Remember the "=" command? This file is also too long for you to print out in full. Type "answer N" where N is the number of the last line. #create text a able about above absolutely accidents act add administered admiration adoring advancing adventure advised after afternoon afterward again against agent alacrity all allow almost alone along alongside alp-climbers alpenstock alpine alps already also alter although am among an and animal animals another anxiety? any apparent applause appointed appreciation are argued armor-bearers around arrange arrived article as ascend ascending ascent aside asked assailed assaulting assembled assist at attempt attended attention attracted avalanches away awful back badly baffled barometer barrier battered battle be beautiful because become bed been before began beginning behind being believed beneficent better between big bitter black blue book both boughs brass break breast breath bridge bringing broke broken brought burdens burst but by called calmly came can cannot caravan carpeted carried case catch caught caused cavalcade ceased cellar center certainly chair chance change chaplain cheered chief chilly church circumstance citizens civilization clear clearly climb climber clock closed clove coil cold column comfort command commanded commended concluded condition confronted consequently considerable considered consisted constantly consulting contrived convinced cord could country couple courage course cover covered cows crash crawling crept crippling crossed crowd crowded cruel crumbly crutches custom cut danger dangerous dark dead deaf dear decided decked declared deep deeply defective demanded demoralization densely deployed descending describe desert deserted despair despondency detachment detail detailing did die directly dirt disappear disappeared dismal disposition divert do doing done donkey doom down draped dressed drooped dull dumb during eager ear ears earth earthquake easy eat edelweiss either elephants eleven eloquence embrace encounter end ended enough entered entirely established estimate even evening events ever every everybody examine exceeded excellent except excess exclaimed excursions executed exhaustion expected expedition experimenter explained explosion extreme eye eyes face faces fact fagged failed fainted fallen false far fast fastened faster fatal father fatigue fear feared fearful fears feature feel feet fell fellow fetch feverishly few fifteen filing find finer firmly first five five-pound fixed flank foot for forest forgotten form forth forty-foot forward found four frantic free frequency fresh friend frightened from front frozen full furthest fury gave gazing general gentle get give glad glanced gliding go going gone good got grace grand gratifying great green ground grow growing guide guides guttered had half half-mile halt hampered hand hands happened harder hardly harris hat hate haunts have having he head hear heard heavens heavy held here hesitated high hill him himself his hoist hold homes hook hook-rope hoping horns host hotel hotels hour hours how hurry huts huzza i ice-ax ice-axes idea if implement implements imposing impressive impulse in inches including indignant ingratitude injured innocent inquiries? inquiring #copyin #user #uncopyin tail -1 .copy >X1 %s/../lcount <text >X2 #cmp X1 X2 #log #next 21.1e 6 L21.1e #print This directory contains a file "abot" which has an extra line (one line was typed twice). Remove the extra line and rewrite the file; then type "ready". This file is fairly short. #create Ref seven qualities characterize the clod and seven the wise man: the wise man does not speak before him that is greater than he in wisdom; he does not break into his fellow's speech; he is not in a rush to reply; he asks what is relevant and replies to the point; he speaks of first things first and of last things last; of what he has not heard he says "I have not heard"; and he acknowledges what is true. and the opposites apply to the clod. #create abot seven qualities characterize the clod and seven the wise man: the wise man does not speak before him that is greater than he in wisdom; he does not break into his fellow's speech; he is not in a rush to break into his fellow's speech; he is not in a rush to reply; he asks what is relevant and replies to the point; he speaks of first things first and of last things last; of what he has not heard he says "I have not heard"; and he acknowledges what is true. and the opposites apply to the clod. #user #cmp abot Ref #log #next 30.1a 10 30.2a 5 L3.1a ,? #print The editor accepts commands one per line, just like the other programs in UNIX; but its commands are unique to it. The only command present in every editing session is the last one, 'q' (quit) which returns to the normal command interpreting program. I'm going to put you in the editor. Type 'q' to leave, and then type "ready" when you get the '$' from the normal command handler. #create junk You're in the editor. #pipe ed - junk 1p #user #unpipe #cmp junk junk #log #next 3.1b 5 tL3.1b > #print A particularly important editor command is 'w' (write). This writes whatever you are working on, including everything you have typed in or changed, into a file, so that you can work on it again later. If you try to quit from the editor without writing out your changes, the editor will complain (but only once -- a second 'q' will let you out). Generally it's wisest to leave the editor by typing w q rather than just 'q'. I'll put you in the editor; type those two commands to leave. Then type "ready". #create bpres Washington Adams Jefferson #create pres Washington Adams Jefferson #pipe ed pres #user #unpipe #cmp pres bpres #succeed Note that the editor typed 27. This is the number of characters it wrote into the file. This is reassuring - it tells you the write was successful. The count of characters read is also typed, which is why you got a '27' before your responses. #log #next 4.1a 10 4.2a 5 L30.1a O 0#print Although it is always possible to fix errors by retyping the entire erroneous line with the 'c' command, it is usually much faster to make small changes within a line. The editor allows this with the 's' (substitute) command. For example, s/abc/def/ will change a line previously reading xxx abc into one reading xxx def by replacing the string 'abc' in the line with the string 'def'. In this directory is a file 'pres' with one line that says 'harry' where it should say 'george'. Fix it using the substitute command to change 'harry' into 'george'. You should use the 'p' command to print the line before and after, checking that you did it correctly. Then rewrite the file and type 'ready'. #create Ref george washington #create pres harry washington #user #cmp Ref pres #log #next 30.1b 10 L30.1b #print As with other commands, you can specify a line number in front of the 's' command. Thus 3s/x/a/ will change the first 'x' to an 'a' on the third line of the current file. Pick up file 'town' and change the 'q' on the last line to a 'p'. Then rewrite the file and type 'ready'. #create Ref south orange maplewood millburn short hills summit new providence #create town south orange maplewood millburn short hills summit new qrovidence #user #cmp town Ref #log #next 31.1a 10 L30.2a p #print Changing a whole line with the 'c' command is a slow way to work when you only want to change a few letters. The 's' (substitute) command changes the letters within a line. For example, the command s/abc/def/ will change a line reading xxxabc into one reading xxxdef by replacing the string 'abc' with 'def'. Try the following sequence which alters the first line of the file 'test' within this directory: ed test 1p s/months/years/ 1p w q ready #create Ref Four score and seven years ago our fathers brought forth ... #create test Four score and seven months ago our fathers brought forth ... #user #cmp test Ref #log #next 30.2b 5 L30.2b #print In this directory is a file 'pres' whose first line says 'harry' where it should say 'george'. Fix it using the substitute command to change 'harry' into 'george'. You should use the 'p' command to print the line before and after, checking that the change took place. Then rewrite the file and type 'ready'. #create Ref george washington #create pres harry washington #user #cmp pres Ref #log #next 30.1b 10 30.2c 5 L30.2c #print As with other commands, you can specify a line number with the 's' command. Thus 3s/x/a/ will change the first 'x' on line 3 to an 'a'. Here is a file "street" in which the fifth line has an 'r' where it should have an 'a'. Try the sequence ed street 5s/r/a/ 5p w q ready #create Ref first avenue second avenue third avenue lexington avenue park avenue madison avenue #create street first avenue second avenue third avenue lexington avenue prrk avenue madison avenue #user #cmp street Ref #log #next 30.2d 5 L30.2d 3#print In this directory is a file named "airport" whose second line says "xx" where it should say "ne". Edit the file, change those letters, and rewrite the file. Then type "ready". #create Ref idlewild newark laguardia #create airport idlewild xxwark laguardia #user #cmp airport Ref #log #next 30.2e 5 uL30.2e FP O#print Now edit the file named "town" and change the 'q' on the last line to a 'p'. Rewrite the corrected file and type 'ready'. #create Ref south orange maplewood millburn short hills summit new providence #create town south orange maplewood millburn short hills summit new qrovidence #user #cmp town Ref #log #next 30.2f 5 31.1a 10 eL30.2f G#print Now there is a file named "equipment" and on the next to last line is a word that contains 'nn' where it should have 'mm'. Fix it and rewrite the file. Then type "ready". #create Ref screwdriver wrench saw hammer pliers #create equipment screwdriver wrench saw hanner pliers #user #cmp equipment Ref #log #next 30.2g 5 1L30.2g X#print This directory contains a file named "markets" which has a 'q' on the last line where it should have a 'p'. Rewrite the corrected version on a new file named "nmark". Then type "ready". #create Ref shop-rite acme kings a&p finast pathmark #create markets shop-rite acme kings a&p finast qathmark #user #cmp nmark Ref #log #next 30.2h 5 L30.2h I #print The two files you were editing are still around here. Use "diff" to see what the differences between them are and check that the correction was made properly. Then type "ready". #create markets shop-rite acme kings a&p finast qathmark #create nmark shop-rite acme kings a&p finast pathmark #copyin #user #uncopyin #match diff markets nmark #match diff nmark markets #log #next 31.1a 10 L31.1a }#print I hope you have been checking the effects of your substitutions by using the 'p' command before and after the changes. This is so often desired that you may type the 'p' on the same line, after the 's' command. Thus s/ab/cd/p changes 'ab' to 'cd' and prints the line after the change. In this directory there is a file named 'tree'. Try changing the fourth line, which now reads spruxx to read spruce and then rewrite the file, and type 'ready'. #create Ref pine fir hemlock spruce birch beech hickory maple #create tree pine fir hemlock spruxx birch beech hickory maple #user #cmp Ref tree #log #next 32.1a 10 31.2b 5 L31.2b \#print This directory contains a file "animal" which has a mistyped line. Print the file, find the line, fix the error using the 's' command, and then rewrite the corrected file and type "ready". #create Ref cat dog raccoon groundhog mouse mole #create animal cat dog rakkoon groundhog mouse mole #user #cmp animal Ref #log #next 32.1a 10 31.2c 5 L31.2c #print In this directory there is a file "checks" which contains 3 errors. Fix the spelling errors and rewrite the file. Then type "ready". #create Ref The establishment of credit all over the civilized world made it possible to develop new inventions, enlarge factories, produce more goods so that more people could earn wages to buy them. Soon even the supply of paper money would have been too small to take care of the needs of business, had it not been for a new form of money. This was the "check-book dollar." There are now from 25 to 30 billion dollars in paper money circulating in the United States. But that is only one tenth of what is needed to do business every year. The other 90 per cent is in the form of check-book dollars. #create checks The establishment of credit all over the civilized world made it possible to develop new inventions, enlarge factories, produce more goods so that more people could earn wages to buy them. Soon even the supply of paper money would have been too smalp to take care of the needs of businees, had it not been for a new form of money. This was the "check-book dollar." There are now from 25 to 30 billion dollars in paper money circulating in txe United States. But that is only one tenth of what is needed to do business every year. The other 90 per cent is in the form of check-book dollars. #user #cmp checks Ref #log #next 32.1a 10 32.2a 5 oL32.1a iQ #print Just as you can specify files with an abbreviation, it is also possible, in the 's' command, to use an abbreviation for the string to be used for substitution. Unfortunately, the characters used to indicate an abbreviation are quite different, and you must learn them separately for the editor and the file-name interpreter. (Sorry about that, but that's the way the world is.) The symbol for 'any character' is '.'. Thus s/a./bc/p looks for an 'a' followed by anything, and changes those characters into 'bc'. Thus the line what now would become whbc now after that command. What will the word "floating" become after s/a./or/ is executed? Type "answer WORD" where WORD is the new version. #copyin #user #uncopyin #match flooring #log #next 32.1b 10 L32.1b |#print Note that the substitute command changes the first instance of something that matches. Consider the line now is the time for all good men and the substitute command s/tim/TIM/ applied to it. Which word in the line will be altered by that command? Type "answer WORD" where WORD is the word that will be changed. #copyin #user #uncopyin #match time #log #next 32.1c 10 L32.1c #print Now, with the line now is the time for all good men and the command s/t../TIM/p what word will be changed? Again, type "answer WORD"; remember that "." matches any character, and the first match is picked. #copyin #user #uncopyin #match the #log #next 33.1a 10 33.2a 5 L32.2a #print Just as you can use abbreviations to specify a class of filenames, you can use abbreviationss in the editor to recognize strings in the substitute command. Unfortunately, the characters used in the editor are quite different from the ones used in the file-name handler to specify patterns. (Sorry about that, but that's the way the world is.) The symbol for 'any character' is '.' and this will match any single letter or other character in a line. For example, s/a./bc/ looks for an 'a' followed by anything, and changes those two letters into 'bc'. Try this sequence and note what happens. ed line p s/a./bc/p w q ready #create Ref me bcd you #create line me and you #user #cmp line Ref #log #next 32.2b 5 32.2c 10 iL32.2b 7#print Or, to take another example, the command s/h./ar/ would turn the word "that" into "tart": the '.' matches the 'a'. What would that command change the word "what" into? Reply "answer WORD" where WORD is what the substitute command would produce. #copyin #user #uncopyin #match wart #log #next 32.2c 5 tL32.2c #print What will the word "floating" become after the command s/a./or/ is executed? Type "answer WORD" where WORD is the new version. #copyin #user #uncopyin #match flooring #log #next 32.2d 5 32.1b 10 WL32.2d Q #print Is the word "stop" changed by the command s/to/xx/p Type "yes" or "no". #copyin #user #uncopyin #match yes #log #next 32.2e 5 .L32.2e Q #print Is the word "stop" changed by the command s/tp/xx/p Type "yes" or "no". #copyin #user #uncopyin #match no #log #next 32.2f 5 32.1b 10 nL32.2f Q #print Is the word "stop" changed by the command s/t./xx/p Type "yes" or "no". #copyin #user #uncopyin #match yes #log #next 32.2g 5 2L32.2g $#print One place where "." is useful is in changing letters that are hard to type, e.g. the # and @ characters. For example, the command s/a.b/xxx/ will change "a#b" to "xxx". There is a file named "goof" in this directory whose third line contains the word sp#xll which should be "spell". Change it and rewrite the file; then type "ready". #create Ref whoever typed this either couldn't type or couldn't spell properly. #create goof whoever typed this either couldn't type or couldn't sp#xll properly. #user #cmp goof Ref #log #next 32.1b 5 L33.1a #print When you want to match one of a few specific characters, and not just any character, the pattern is similar to the pattern used in filenames. The patterns used with the editor, by the way, are called "regular expressions". The string [abc] matches 'a', 'b' or 'c'. So if the current line is now is the time for all good men and the command is s/t[ijk]/xx/ what word is changed? Type "answer WORD" where WORD is the word changed by that command. #copyin #user #uncopyin #match time #log #next 33.1b 10 eL33.1b , #print Write the command that will change either the word "that" or the word "than" into "this", and then print the result. Type "answer COMMAND" on a line, where COMMAND is that string. (That is, COMMAND will be of the form s/.../.../p where you have replaced the ... with the right stuff.) You can test this out by going into the editor and typing in a line that contains "that" and "than" and trying to change it. You should do that until you are sure you have the command right. #copyin #user #uncopyin #match s/tha[nt]/this/p #match s/tha[tn]/this/p #match s/tha[nt]/this/gp #match s/tha[tn]/this/gp #log #next 34.1a 10 34.2a 5 pL33.2a #print When you want to match one of a few specific characters, and not anything, the pattern is similar to that used in file names. That is, [abc] matches the letters 'a', 'b', or 'c', but nothing else. Try this sequence and note what happens: ed lines 1,$p 1s/[123]/9/ 2s/[123]/9/ 1,$p w q ready #create Ref 599 948 #create lines 519 348 #user #cmp lines Ref #log #next 33.2b 5 L33.2b { #print You can of course use the [] operators anywhere in a pattern. Editor patterns, by the way, are called "regular expressions". For example, suppose you wanted to change either the word "trick" or the word "track" to "stop". What command would you need? Do you see that s/tr[ia]ck/stop/p will do that? Now figure out what command you would need to change either "bear" or "beat" into "best" and print the line after the change. Type "answer COMMAND" where COMMAND is that line. #copyin #user #uncopyin #match s/bea[rt]/best/p #match s/bea[tr]/best/p #match s/bea[rt]/best/ You forgot the "p" part. #match s/bea[tr]/best/ You forgot the "p" part. #log #next 33.2c 5 L33.2c #print Suppose the current line is now is the time for all good men and you type the substitute command s/t[ijk]/xx/ what word is changed? Type "answer WORD" where WORD is the word changed in the line. #copyin #user #uncopyin #match time #log #next 34.1a 10 33.1b 5 L34.1a S #print You can also specify "all characters except ..." using an expression of the form [^ab] which means "anything except an 'a' or 'b' character". Will s/ab[^cde]/xyz23/p change xbcabfgh Type "yes" or "no". #copyin #user #uncopyin #match yes #log #next 34.1b 10 L34.1b S 3#print Will the command s/ab[^cde]/xx/p change the line abcxyzabfxyz Type "yes" or "no". #copyin #user #uncopyin #match yes #fail Remember that the s/.../../ command will keep looking through the line for something to change, even if the beginning of the line doesn't match. #log #next 35.1a 10 35.2a 5 tL34.2a 4#print You can also specify "all characters except ..." using an expression of the form [^ab] which means "any character except the letters 'a' or 'b'. This is just like filename patterns again. Does [^abc] match the letter 'a'? Answer "yes" or "no". #copyin #user #uncopyin #match no #log #next 34.2b 5 L34.2b x #print Does [^abc] match the letter 'd'? Answer "yes" or "no". #copyin #user #uncopyin #match yes #log #next 34.2c 5 L34.2c i #print Does [abc] match 'a'? Answer "yes" or "no"? #copyin #user #uncopyin #match yes #log #next 34.2d 5 L34.2d v #print Does [^abc] match the '*' character? Type "yes" or "no". #copyin #user #uncopyin #match yes #log #next 34.2e 5 L34.2e #print Suppose you wanted to match all letters and punctuation marks. You could try [^ ] which is "anything but blank". Try the following commands: ed cut 1p 1s/p[^ ]/xxx/p w q ready #create Ref stop this comxxxter #create cut stop this computer #user #cmp cut Ref #log #next 34.2f 5 oL34.2f IT #print Will s/ab[^cde]/xyz23/p change xbcabfgh Type "yes" or "no". (Try it out first in the editor if you don't know.) #copyin #user #uncopyin #match yes #log #next 34.1b 10 L35.1a }#print The "*" character is also used in substitute commands, but it has a different meaning. Here it means "any number of repetitions of the previous character". (including zero!). Thus a* is any number of 'a' characters, and [ab]* is any number of either 'a' or 'b' characters. So s/ab*/xy/ looks for an 'a' followed by any number of 'b' letters, and will change abbb cde into xy cde You can use '*' after anything, including for example blank. Thus s/a */a/ removes all the blanks after the letter 'a'. In this directory there is a file 'text'. On the third line, remove the blanks after the word 'the'. Then rewrite the file and type "ready". #create Ref This is the file for experimentation with the(substitute) command. #create text This is the file for experimentation with the (substitute) command. #user #cmp text Ref #log #next 36.1a 10 36.2a 5 cL35.2a { s#print The '*' character is also used in the editor patterns (the regular expressions) but it has quite a different meaning from '*' as used in filenames. In the editor it means "any number of repetitions of the previous character." Thus a* might match "a" or "aa" or "aaa" or "aaaa" and so on. It might also match nothing, because "any number of repetitions" includes "zero"! Perhaps it will be clearer after you do the following example. Note what happens to the two lines. Type ed file 1,2p 1s/xa*/xy/ 2s/xa*/xy/ 1,2p w q ready #create Ref abxy abxycd #create file abxaaa abxcd #user #cmp file Ref #log #next 35.2b 5 L35.2b % D#print Now suppose we wanted to delete the blanks after the letter "t" in this line: here are a lot of blanks This line is on file "blank". Try the sequence ed blank 1p s/t */t/p w q ready #create Ref here are a lotof blanks #create blank here are a lot of blanks #user #cmp blank Ref #log #next 35.2c 5 L35.2c :#print You can use '*' to look for a string of characters from one of the character classes. Suppose, for example, we wanted a long string of either 'a' or 'b', followed by 'x'. Then we could write s/[ab]*x/.../ In this directory is a file named "table". It has only one line. On that line, replace all the digits followed by a comma with the letters "too big". For example, "123,000" should become "too big,000". Then rewrite the file and type "readY". #create Ref Heathrow too big,159 #create table Heathrow 17073,159 #user #cmp table Ref #log #next 35.2d 5 L35.2d WU \#print A useful operation is to replace a string of several blanks by exactly one blank. Note that you can't just write s/ */ / because the " *" willl match any number of blanks including zero. Thus it will always match at the beginning of the line, even if there is no blank there. The normal sequence is s/ */ / which will only substitute for a string that has at least one blank in it. Try that command on the line in the file "line". Then rewrite the file "line" and type "ready". #create Ref here is a long space. #create line here is a long space. #user #cmp line Ref #log #next 35.2e 5 L35.2e U #print A very powerful construction is ".*", which matches any character (remember '.') repeated any number of times. For example s/a.*b/.../ replaces anything of the forms axyzb, aaaaaab, a1234b, abbbb since it requires just an 'a' and a 'b' at the ends of the string, with anything at all in between. Or, to throw away everything on a line after the word "stop", you could try s/stop.*/stop/ In this directory is a file "sentence". Delete everything after the word "last" on the second line of the file. #create Ref This file has a sentence in which this is the last #create sentence This file has a sentence in which this is the last word which should be left. #user #cmp sentence Ref #next 36.1a 10 36.2a 5 L36.1a ?#print So far all the special characters in the substitute command have been used in the left-hand expression, the one that is looked for in the line as it exists before the change. None of these characters are meaningful in the right-hand expression; for example, s/ab/a./ turn "ab" into "a." just as if "." were an ordinary letter. But there is one character that is special on the right side of a substitution, which is '&'. The ampersand is replaced by whatever text is being replaced. In s/the/&m/ the string "the" is turned into "them" because the '&' is replaced by "the". In this directory there is a file 'text'; on the third line, change the word 'dog' into 'dogs'; then rewrite the file and say "ready". #create Ref cat mouse dogs rat #create text cat mouse dog rat #user #cmp text Ref #log #next 37.1a 10 37.2a 6 oL36.2a (#print So far all the special characters in the substitute command are used to select the string to be replaced. There is one character used in the new string to be inserted. It is '&' which when used on the right hand side of a substitution, refers to the expression given on the left hand side. For example, the command s/the/&m/ changes "the" into "them". Try that on file "text"; then rewrite the file and type "ready". #create Ref we went to see them yesterday. #create text we went to see the yesterday. #user #cmp text Ref #log #next 36.2b 5 L36.2b #print Now, in file 'pets', change the word 'dog' on the third line into 'dogs'. Then rewrite the file and type "ready". #create Ref cats hamsters dogs gerbils #create pets cats hamsters dog gerbils #user #cmp pets Ref #log #next 36.2c 5 oL36.2c #print On the right side of a substitute, none of the other special characters mean anything unusual. Thus, if you wanted to replace the letter 'a' by an asterisk, for example, the obvious com and would work: s/a/*/p Try, in the file "data", replacing the comma on the last line with a period. Then rewrite the file and type "ready". #create Ref Square Roots 1.00 1.00 2.00 1.42 3.00 1.73 4.00 2.00 You really shouldn't be printing all of this file - did you forget that '$' is the address of the last line of a file? Use that instead of printing everything. 5.00 2.23 6.00 2.45 7.00 2.65 8.00 2.83 #create data Square Roots 1.00 1.00 2.00 1.42 3.00 1.73 4.00 2.00 You really shouldn't be printing all of this file - did you forget that '$' is the address of the last line of a file? Use that instead of printing everything. 5.00 2.23 6.00 2.45 7.00 2.65 8.00 2,83 #user #cmp data Ref #log #next 36.2d 5 L36.2d #print On line 4 of the file "attribute" is either the word "color" or the word "Color". With one command add an 's' to the end of the word. Check that you did it right; then rewrite the file and type "ready". #create Ref size weight mass density shade hue quality age price lifetime Colors durability #create attribute size weight mass density shade hue quality age price lifetime Color durability #user #cmp attribute Ref #log #next 37.1a 10 37.2a 6 L37.1a #print You can use a range of line numbers with the substitute command to change more than one line at once. For example, 1,5s/dog/&s/ will change "dog" on each of the first five lines of the file into "dogs". Edit file "text" and change the word "cat" on every line into "mouse". Then rewrite the file and type "ready". #create Ref domestic mouse alley mouse persian mouse angora mouse wildmouse #create text domestic cat alley cat persian cat angora cat wildcat #user #cmp text Ref #log #next 38.1a 10 38.2a 6 L37.2a #print A range of line numbers can be used with the substitute command as with the print command. For example, $-4,$s/cat/&s/p will change "cat" into "cats" on the last five lines of a file. In this directory there is a file "cliche" containing a number of instances of the word "dog"; change the instances of "dog" in the first five lines to "dogs". Then rewrite the file and type "ready". #create Ref dogs tired sick as a dogs dogs eared wouldn't send a dogs out on a night like this every dogs has his day dog gone #create cliche dog tired sick as a dog dog eared wouldn't send a dog out on a night like this every dog has his day dog gone #user #cmp cliche Ref #log #next 37.2b 5 L37.2b ,#print Now edit file "text" and change the "cat" on every line into "mouse". Then rewrite the file and type "ready". #create Ref domestic mouse alley mouse persian mouse angora mouse wildmouse #create text domestic cat alley cat persian cat angora cat wildcat #user #cmp text Ref #log #next 37.2c 5 L37.2c I#print How would you find a string of digits? Remember [1234567890][1234567890]* as an expression? In this directory is a file "table" which contains some numbers. On every line of the file, follow all numbers by the character '%'. It should only take one 's' command. Then rewrite the file and type "ready". #create Ref Budget Outlays Salaries 32% Equipment 40% Rent 13% (incl. utilities) Interest 9% Misc. 6% #create table Budget Outlays Salaries 32 Equipment 40 Rent 13 (incl. utilities) Interest 9 Misc. 6 #user #cmp table Ref #log #next 37.2d 5 6L37.2d {#print There is another file named "table" in this directory. Find all numbers and surround them with "*" characters (that is, "345" becomes "*345*". Then rewrite the file and type "ready". #create Ref Income Wages *73* Interest *20* Gambling *5* Other *2* #create table Income Wages 73 Interest 20 Gambling 5 Other 2 #user #cmp table Ref #log #next 37.2e 5 1L37.2e #print Here is something a bit trickier. We want to add an extra space after each word "lengthen". However, some of the instances of "lengthen" are followed by commas or right parentheses and we want the sapace after the comma or right parenthesis in that case. That is, the desired transformations are: now new lengthen xx lengthen xx lengthen, xx lengthen, xx lengthen) xx lengthen) xx lengthen), xx lengthen), xx It should only take one substitute command to do this. Remember that "*" matches zero or more instances of whatever precedes it. Try those changes on the first six lines of the file "text" in this directory. Then rewrite the file and type "ready". #create Ref To lengthen this is easy, whereas to lengthen, rather than to shorten, on the previous line is hard. (To lengthen) is an infinitive. I said to him, (please lengthen), and he did so. Why not lengthen this word? Notice it is on line 7. #create text To lengthen this is easy, whereas to lengthen, rather than to shorten, on the previous line is hard. (To lengthen) is an infinitive. I said to him, (please lengthen), and he did so. Why not lengthen this word? Notice it is on line 7. #user #cmp text Ref #log #next 37.2f 5 L37.2f _#print The file "paragraph" in this directory contains a number of commas followed by blanks. Please see to it that all commas are followed by exactly one blank. Then rewrite the file and type "ready". #create Ref This text, although somewhat strained, is not really unintelligible. We have, you see to get enough commas, like this into it to give you some real practice. #create paragraph This text, although somewhat strained, is not really unintelligible. We have, you see to get enough commas,like this into it to give you some real practice. #user #cmp paragraph Ref #log #next 38.1a 10 38.2a 6 PL38.1a #print Sometimes it is desirable to specify that the characters to be changed are at the beginning of the line. This uses the '^' character. For example, s/^ab/xy/p will change "ab" to "xy" ONLY if "ab" begins the line. Remember that s/ab/xy/p would just change the first "ab" anywhere in the line. In this directory there is a file "text"; whenever the letters "cat" begin a line, change them to "mouse; but leave other instances of "cat" unaltered. Do this on each line (it only takes one command, as you know). Then rewrite the file and type "ready". #create Ref mouse's paw alley cat mouse has nine lives let the cat out of the bag #create text cat's paw alley cat cat has nine lives let the cat out of the bag #user #cmp Ref text #log #next 39.1a 10 L38.2a , #print Sometimes you want to recognize a string of characters only if they appear at the beginning of the line. The character '^' is used for this purpose. The command s/^ab/xy/ will change "ab" to "xy" only if "ab" begins the line. Try the following and watch what it does. ed file 1,2p 1,2s/^ab/xy/ w q ready #create Ref xycd abcd #create file abcd abcd #user #cmp file Ref #log #next 38.2b 5 L38.2b #print In this directory there is a file "text"; whenever the letters "cat" begin a line, change them to "mouse"; but leave other instances of "cat" unaltered. Do this on each line. Then rewrite the file and type "ready". #create Ref mouse's paw alley cat mouse has nine lives let the cat out of the bag #create text cat's paw alley cat cat has nine lives let the cat out of the bag #user #cmp text Ref #log #next 39.1a 10 eL39.1a #print Using the "^" character, you can easily put things at the beginnings of lines. For example s/^/***/ puts "***" at the beginning of the line. Now edit the file "text" and put the symbol '=' at the beginning of lines 3 through 5. Then rewrite the file and type "ready". #create Ref beef pork =chicken =duck =turkey lamb fish #create text beef pork chicken duck turkey lamb fish #user #cmp text Ref #log #next 40.1a 10 L4.1a ? j#print You must recognize that the commands typed at the editor are distinct from the commands typed at the normal UNIX command interpreter. In particular, neither program knows the commands recognized by the other one. So you must always remember when you are talking to the normal command interpreter (the one that says $ to you) and when you are talking to the editor. The commands 'w' and 'q' are recognized by the editor. The commands 'ls', 'mv' and so forth are not. Can you expect the editor to recognize the command cat george Type yes or no. #copyin #user #uncopyin #match no #log #next 4.1b 5 5.1a 10 L4.1b ? #print Can you expect the normal command interpreter (called the 'shell') to recognize w Type yes or no. #copyin #user #uncopyin #match no #log #next 5.1a 10 L4.2a ? i#print The editor and the 'shell' (the normal command interpreter) accept different commands. The shell (which types '$' at you) understands "ls", "mv", "cp", "date" and so forth; the editor understands such commands as 'w' or 'q'. Who knows about "diff"? Type "answer shell" or "answer editor". #copyin #user #uncopyin #match shell #log #next 4.2b 5 4.1b 10 L4.2b & #print Who will recognize 'w'? Type "answer shell" or "answer editor". #copyin #user #uncopyin #match editor #log #next 4.1b 5 5.1a 10 sL40.1a #print There is also a special character which indicates the end of the line. It is '$'. So that s/ab$/xy/ changes 'ab' to 'xy' only if 'ab' ended the line. In the file 'text' there are some lines which end in 'cup'. Change them to end in 'saucer'. Again, it only takes one command. Then rewrite the file and type 'ready'. #create Ref 3 teaspoons = 1 tablespoon 16 tablespoons = 1 saucer 48 teaspoons = 1 saucer 2 cups = 1 pint 2 pints = 1 quart 1/2 pt = 1 saucer #create text 3 teaspoons = 1 tablespoon 16 tablespoons = 1 saucer 48 teaspoons = 1 saucer 2 cups = 1 pint 2 pints = 1 quart 1/2 pt = 1 saucer #user #cmp text Ref #log #next 40.1b 5 40.2b 10 L40.1b V #print You can also use '$' when you just want to add something to the end of a line. For example, s/$/./ puts a period at the end of a line, without destroying anything in the line. In file 'decl' there should be a comma at the end of the third line. Edit this file, put in the comma, and rewrite the file. Then type "ready". #create Ref When in the course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth the separate and equal station to which the laws of Nature and of Nature's God entitle them ... #create decl When in the course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another and to assume among the powers of the earth the separate and equal station to which the laws of Nature and of Nature's God entitle them ... #user #cmp decl Ref #log #next 41.1a 10 40.2b 9 L40.2b n#print In the file "section" change all lines ending in the characters ", to end in ," so that, for example, the line He said "I'll come", becomes He said "I'll come," and then rewrite the file and type "ready". #create Ref This passage contains a few quoted "strings," of which some are "in the middle", and some "are at the beginning", and some "are at the end," but all end with commas. #create section This passage contains a few quoted "strings", of which some are "in the middle", and some "are at the beginning", and some "are at the end", but all end with commas. #user #cmp section Ref #log #next 40.2c 5 L40.2c #print In the file "mess" delete all blanks at the ends of lines. Be prepared to delete several blanks if need be (remember the '*' character). Then rewrite the file and type "ready". #create Ref It is possible to use a small counter to keep approximate counts of large numbers. The resulting expected error can be controlled. #create mess It is possible to use a small counter to keep approximate counts of large numbers. The resulting expected error can be controlled. #user #cmp mess Ref #log #next 40.2d 5 L40.2d #print In file "poem" add the character "." (period) at the end of lines 3 through the end of the file. Then rewrite the file and type "ready". #create Ref When I was a lad I served a term As office boy in an attorney's firm I washed the windows and I swept the floor. And I polished up the handles on the big brass door. I polished up those handles so carefully. That now I am the ruler of the Queen's Navy. #create poem When I was a lad I served a term As office boy in an attorney's firm I washed the windows and I swept the floor And I polished up the handles on the big brass door I polished up those handles so carefully That now I am the ruler of the Queen's Navy #user #cmp poem Ref #log #next 41.1a 10 nL41.1a { [#print One thing you must be careful of is that the substitute command does not know about word boundaries. It will change the first occurrence of a letter string it matches without regard to blanks or punctuation around it. Thus, if the current line is i would rather be the king and you type s/the/a/p you get i would raar be the king instead of i would rather be a king Right? You should always print lines after changing them to avoid missing such errors. You can defend against them by increasing the amount of context you specify; in this case, for example, you could say s/the /a /p and get i would rather be a king Often the "$" operator is useful here, if you want to change the last thing on the line. In the file 'text', the third line reads never, never, never, never, never Edit this file to make the third line read never, never, never, never, or hardly ever Rewrite the file and type "ready". #create Ref why should a dog, a horse, a rat, have life, and thou no breath at all? thou'lt come no more, never, never, never, never, or hardly ever pray you, undo this button. thank you, sir. #create text why should a dog, a horse, a rat, have life, and thou no breath at all? thou'lt come no more, never, never, never, never, never pray you, undo this button. thank you, sir. #user #cmp text Ref #log #next 42.1a 10 41.1b 5 42.2a 6 vL41.1b #print There is a mistyped word in the third line of the file "problem". Fix it, rewrite the file, and type "ready". #create Ref The computer costs too much. No one knows how to use it. The switchboard in the main office is broken. It takes too long to get anything done. #create problem The computer costs too much. No one knows how to use it. The switchboard in thb main office is broken. It takes too long to get anything done. #user #cmp problem Ref #log #next 42.1a 10 42.2a 5 L42.1a #print Normally the 's' command only changes the first instance on a line of the expression it is looking for. Sometimes you want to change more than one instance. If you put a 'g' after the command, as in s/cat/dog/g all instances of 'cat' will be changed to 'dog'. To print the result you must say s/cat/dog/gp ('pg' at the end doesn't work, sorry). Edit file 'stuff' in this directory to change every instance of 'green' to 'red' on every line. Then rewrite the file and type "ready". #create Ref red light, village red red book, red paper, red pencil red car, red sign, redhorn #create stuff green light, village green green book, green paper, green pencil green car, green sign, greenhorn #user #cmp stuff Ref #log #next 43.1a 10 43.2a 5 fL42.2a 2 #print Normally the 's' command only changes the first instance on a line of the expression it is recognizing. Sometimes you want to change everything. For example, try the following sequence, and note the difference between the changes on the two lines. ed test 1,2p 1s/cat/cats/p 2s/cat/cats/gp w q ready #create Ref the cats in the catalog is a persian cat the cats in the catsalog is a persian cats #create test the cat in the catalog is a persian cat the cat in the catalog is a persian cat #user #cmp test Ref #log #next 42.2b 5 L42.2b #print Now pick up the file 'stuff', change all instances of "green" everywhere to "red", and then rewrite the file and type "ready". #create Ref red light, village red red book, red paper, red pencil red car, red sign, redhorn red with envy #create stuff green light, village green green book, green paper, green pencil green car, green sign, greenhorn green with envy #user #cmp stuff Ref #log #next 42.2c 5 L42.2c #print Remember the procedures with '*' for changing one or more of something into one something. Pick up the file "sloppy" and on every line, whereever there are several blanks in a row change them to one blank. This can be done with one command; it is a very common task. Then rewrite the file and type "ready". #create Ref It seems that medieval art Alone retains its zest To charm and please its devotees We've done our level best We're not quite sure that all we do Has the Early English ring But as far as we can tell It's something like this sort of thing. #create sloppy It seems that medieval art Alone retains its zest To charm and please its devotees We've done our level best We're not quite sure that all we do Has the Early English ring But as far as we can tell It's something like this sort of thing. #user #cmp sloppy Ref #log #next 43.1a 10 43.2a 5 L43.1a g| ]#print Note that there is quite a list of special characters recognized by the editor: . [ * ^ $ & / What do you do when you want to specifically use one of these characters as itself, rather than for its funny meaning? You must precede it by a backslash, as in s/\./,/p which will change the line x, y. and z into x, y, and z easily. The same works for all the other special characters. What command would change * into c Type "answer COMMAND" where COMMAND is of the form s/.././p #copyin #user #uncopyin #match s/\*/c/p #match s/\*/c/ You forgot the "p" on the end. #log #next 44.1a 10 L43.2a : E#print Note that there is quite a list of characters that are special to the editor: . [ * ^ $ & / What do you do when you want to use one of these characters as itself, rather than for its special meaning? You must precede it by a backlash. For example, how would you turn ". into ." Try the following sequence: ed test 1,3p 1,3s/"\./."/p w q ready #create Ref This is a "quoted word." Here is "another." Be "careful." Especially with dots. #create test This is a "quoted word". Here is "another". Be "careful". Especially with dots. #user #cmp test Ref #log #next 43.2b 5 L43.2b #print Pick up the file "line" and change x, y. and z into x, y, and z Then rewrite the file and type "ready". #create Ref x, y, and z #create line x, y. and z #user #cmp line Ref #log #next 43.2c 5 iL43.2c #print This is trickier. Change all sequences of several asterisks into one asterisk. E.g. *** xxx **** becomes * xxx * The file is named "stars"; edit it and then rewrite it. Then type "ready". #create Ref List of phone numbers * 6377 * * 4582 * * 3968 * #create stars List of phone numbers ** 6377 *** **** 4582 **** * 3968 *** #user #cmp stars Ref #log #next 43.2d 5 eL43.2d 5 #print This is trickier. File "name" contains A T and T Co. Change it to read A T & T Co. Then rewrite it and type "ready". #create Ref A T & T Co. #create name A T and T Co. #user #cmp name Ref #succeed I hope you used s/and/\&/p and did not retype the line. #log #next 44.1a 5 L44.1a #print You have now learned quite a bit about substitute commands. Here is a larger task to perform. There is a file 'song' in this directory. Edit it; print it out, and notice that there are six mistyped words in it. Fix all of them and rewrite the file. Then type "ready". #create Ref Oh, say can you see by the dawn's early light What so proudly we hailed at the twilight's last gleaming Whose broad stripes and bright stars through the perilous night O'er the ramparts we watched were so gallantly streaming And the rocket's red glare, the bombs bursting in air Gave proof through the night that our flag was still there Oh, say does that star spangled banner yet wave o'er the land of the free And the home of the brave? #create song Oh, say can yuo see by the dawn's early light What so proudly we hailed at the twilight's last glieaming Whose broad stxripes and bright stxars through the perilous night O'er the ramparts we watched were so gallantly streammming And the rocket's red glare, the bombs bursting in air Gave proof through thre night that our flag was still there Oh, say does that star spangled banner yet wave o'er the land of the free And the home of the brave? #user #cmp song Ref #log #next 44.1b 10 L44.1b #print There is a file named "paragraph" in this directory. It contains three spelling errors, one line is duplicated, and the last line is missing (the paragraph should end "has been carefully coded and is now well under control."). Fix it up and rewrite it. Then type "ready". #create Ref Held at arm's length, this program looks pretty impressive. There is a large assortment of data declarations, followed by a computation that is evidently complex enough to warrant a sub-procedure. Declarations are neatly aligned, and the executable statements are staggered so as to indicate several levels of control nesting. There are text strings to suggest the intent of the program, and mnemonic identifiers to give hints about how the results are obtained. The general impression conveyed is that this is a moderately complicated problem that has been carefully coded and is now well under control. #create paragraph Held at arm's length, this program looks pretty impressive. There is a large assortment of dta declarations, followed by a computation that is evidently complex enough to warrant a sub-procedure. Declarations are neatly aligned, and the executable statements are stagggered so as to indicate several levels of control nesting. as to indicate several levels of control nesting. There are text strings to suggest the intent of the program, and mnemonic identifiers to give hints about how the results are obtained. The genreal impression conveyed is that this is a moderately complicated problem that #user #cmp Ref paragraph #log #next 44.1c 10 L44.1c #print There is a file "list" in this directory which contains some names. Here are the addresses: add them on lines after the name (i.e. the file should look like: Joe Blow 45 Western Ave. Elmira, NY 10445 Sam Jones 97 Fifth St. Oshkosh, WI 52302 ... when you are done). Name address is Ford 1600 Pennsylvania Ave., Washington, DC 20515 Fenwick 1 Morris St., Morristown, NJ 07960 Rinaldo 308 Main St., Orange, NJ 07050 Rodino 907 Broad St., Newark NJ 07102 #create Ref The Hon. Gerald Ford 1600 Pennsylvania Ave. Washington, DC 20515 The Hon. Millicent Fenwick 1 Morris St. Morristown, NJ 07960 The Hon. Matthew Rinaldo 308 Main St. Orange, NJ 07050 The Hon. Peter Rodino 907 Broad St. Newark, NJ 07102 #create list The Hon. Gerald Ford The Hon. Millicent Fenwick The Hon. Matthew Rinaldo The Hon. Peter Rodino #user #cmp Ref list #log #next 44.1d 10 oL44.1d ϐ #print In file "locs" is a list of Bell Labs locations. Bring it up to date by a) replace "Raritan River" by "Piscataway" b) delete "Denville". c) insert "Atlanta". d) spell "Merrimack Valley" correctly. #create Ref Allentown Atlanta Centennial Park Chester Columbus Crawford Hill Denver Grand Forks Guilford Center Holmdel Indianapolis Indian Hill Kwajalein Madison Merrimack Valley Murray Hill Piscataway Reading Warren Whippany #create locs Allentown Centennial Park Chester Columbus Crawford Hill Denver Denville Grand Forks Guilford Center Holmdel Indianapolis Indian Hill Kwajalein Madison Merimack Valley Murray Hill Raritan River Reading Warren Whippany #user #cmp locs Ref #log #next 44.1e lL44.1e #print As you've probably noticed, the backslash character "\" is rather special to the editor (and to other programs as well). So what do you do when you have to somehow get a backslash into some text, or to edit it in or out? Getting it in in the first place is quite easy: when you are appending with "a" (or inserting with "i", or changing with "c", or reading with "r"), there's nothing special about "\" at all. To verify this, add the line Two backslashes \\ do not equal one forward slash. to the file "junk", re-write it, then type "ready". #create Ref This is a file with a silly line in it. Two backslashes \\ do not equal one forward slash. #create junk This is a file with a silly line in it. #user #cmp Ref junk #log #next 44.1f 10 tL44.1f ǀ #print The next step is to learn how to edit a line that contains a backslash. On the left side of an "s" command, you place a "\" before the "\" to turn off its special meaning, just as for any other special character like "*" or "[". For example, if you have the line c = '\n' you can change it into c = 'n' with the command s/\\n/n/ or s/\\// (Your choice.) Practice by removing all the backslashes from the file "junk"; when you're done, re-write it and type "ready". #create Ref Now is the time for all good men to come to the aid of their party, or something like that. #create junk Now is \the \tim\\e for all good m\\en \to com\\e \to \the aid of \their par\ty, or som\\e\thing like \tha\t. #user #cmp Ref junk #log #next 44.1g 10 L44.1g t #print Of course, you can also search for lines that contain backslashes; again, it's simply a matter of doubling the backslash in the search pattern. That is, /\\/ finds the next line with a backslash. Find the second occurrence of "\n\n" in the file "prog.c", and type "answer N", where N is its line number. #create prog.c int nsave = 0; selunit() { char fnam[20], s[50]; static char dobuff[50]; char posslev[20][20]; int diff[20], i, k, m, n, best, alts, statb[20]; FILE *f; char zb[200]; static char saved[20]; while (ask) { printf("What lesson? "); fflush(stdout); gets(dobuff); if (strcmp(dobuff, "bye") == 0) wrapup(0); level = todo = dobuff; sprintf(s, "../L%s", dobuff); if (access(s, 04) == 0) return; printf("no such lesson\n"); } alts = 0; retry: f=scrin; if (f==NULL) { sprintf(fnam, "../L%s", level); f = fopen(fnam, "r"); if (f==NULL) { fprintf(stderr, "No script for lesson %s.\n", level); wrapup(1); } while (fgets(zb, 200, f)) { trim(zb); if (strcmp(zb, "#next")==0) break; } } if (feof(f)) { printf("Congratulations\n\n.You have finished this sequence.\n"); fflush(stdout); todo = 0; return; } for(i=0; fgets(s, 50, f); i++) { sscanf(s, "%s %d", &posslev[i], &diff[i]); } best = -1; /* cycle through lessons from random start */ /* first try the current place, failing that back up to last place there are untried alternatives (but only one backup) */ n = grand()%i; for(k=0; k<i; k++) { m = (n+k)%i; if (already(posslev[m])) continue; if (best<0) best=m; /* real alternatives */ alts++; if (abs(diff[m]-speed) < abs(diff[best]-speed)) best=m; } if (best < 0 && nsave) { nsave--; strcpy(level, saved); goto retry; } if (best <0) { /* lessons exhausted or missing */ printf("Sorry, there are no alternative lessons at this stage.\n"); printf("See someone for help.\n\n"); fflush(stdout); todo = 0; return; } strcpy (dobuff, posslev[best]); if (alts>1) { nsave=1; strcpy (saved, level); } todo = dobuff; fclose(f); } abs(x) { return(x>=0? x: -x); } grand() { static int garbage; int a[2], b; time(a); b = a[1]+10*garbage++; return(b&077777); } #copyin #user #uncopyin #match 73 #bad 43 The second______ one. #log #next 44.1h 10 fL44.1h u #print The next trick is to substitute a "\" into a line. The same idea holds: simply double the backslash, but this time on the right side of the "s" command. In the file "prog.c", convert every 'n' into "\n" Re-write the file, and type "ready". #create Ref x = "\n"; y = 'nop'; z = 'lmn'; q = "n"; r = "\n"+1; s = "\n" - "\n"; #create prog.c x = 'n'; y = 'nop'; z = 'lmn'; q = "n"; r = 'n'+1; s = 'n' - 'n'; #user #cmp Ref prog.c #log #next 44.1i 10 L44.1i ( #print One last one with "\". Add the following to the end of the first line in file "temp", separated by a single blank. /* &"\n" isn't &'\n' */ You can do it by re-typing the line, but it's a nice exercise to use "s". Type "ready" after you have re-written the file. #create Ref p = &"\n"; /* &"\n" isn't &'\n' */ #create temp p = &"\n"; #user #cmp temp Ref #log #next 45.1a 10 pL45.1a v M#print There is one last class of substitutions that you should know about: converting one line into two or more by substituting a newline into the middle. Suppose you want to split the line Now is the time for all good men into Now is the time for all good men without re-typing. The substitute command is s/time /time\ / The backslash indicates that a newline is to be inserted at that point; the rest of the "s" command is actually typed on a new line. Practice by splitting the first line in file "btl" into Bell Laboratories Murray Hill, NJ 07974 using the "s" command as illustrated above. Be sure to delete the comma and space properly. Re-write the file, then type "ready". #create Ref Bell Laboratories Murray Hill, NJ 07974 #create btl Bell Laboratories, Murray Hill, NJ 07974 #user #cmp btl Ref #log #next 45.1b mL45.1b v #print The opposite command to splitting is joining. But this isn't done with a "s" as you might expect; it uses an entirely separate command called "j" (for "join"). To join two or more adjacent (!) lines, such as lines 3 through 6, simply type 3,6j You can add a "p" at the end to see the result. If you don't specify any lines, "j" by itself joins line "." and ".+1". In no case does "j" add any extra blanks -- you have to put them in for yourself if you want them. The file "split" has six lines. Convert it into three lines by joining 1 and 2, 3 and 4, and 5 and 6. Make sure that the words are separated by spaces. Re-write, then type "ready". #create Ref Check your arithmetic: avoid costly mistakes. Attach W-2 forms: they must be attached to your return. Sign your return: your spouse must sign too. #create split Check your arithmetic: avoid costly mistakes. Attach W-2 forms: they must be attached to your return. Sign your return: your spouse must sign too. #user #cmp Ref split #log #next 50.1a L5.1a ( #print The most frequently used editor command is p which prints out a line. Try that now. Type the command sequence p w q to print out a line, and then write out the file. Then type "ready". #create Ref This is the line to be printed. Don't forget w, then q. 56 #create file This is the line to be printed. Don't forget w, then q. #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X2 #cmp Ref X2 #log #next 6.1a 5 6.2a 2 uL50.1a $X w#print So far all the addresses you have used have been either line numbers, '$', or '.' (or combinations thereof). The most useful addresses are none of those, but are specifications of lines by content. Anything you can ask the substitute command to find in a line, you can ask the editor to find in a file. In particular, /xx/p is a valid command with a line address /xx/ and the 'p' command operator. The address /xx/ means 'the next line containing an "xx"'. So this command prints out the next line which has an "xx" on it. Edit the file 'text' and print the line which has 'cat' on it. Then leave the editor and type "ready". #create text This is a short list of things you might find in the Sears, Roebuck catalog. tools furniture electrical parts clothes appliances garden equipment. #copyout #user #uncopyout grep catalog\. .ocopy >/dev/null #log #next 50.1b 10 /L50.1b X s#print You can use all the special characters in the search commands. For example, /^cat/p prints the first line that BEGINS with 'cat'. You can even leave out the 'p': /^cat/ does the same thing. Now go into file 'text' with the editor and print the first line that ENDS with 'dog'. Then leave the editor and type 'ready'. #create text This is a file which contains several occurrences of the word 'dog' in several places. It would be a doggone shame if you didn't find the right dog to print out. #copyout #user #uncopyout grep 'dog$' text >X1 grep 'dog' .ocopy >X3 tail -1 X3 >X2 #cmp X1 X2 #log #next 50.1c 10 50.2c 5 tL50.1c k#print You can use other commands than 'p' with these context search addresses, of course. For example, /abc.e/s/ab/xx/p will (1) search for the next line containing the expression "abc.e", which matches any line that has an 'a', then a 'b', then a 'c', then anything, then an 'e' (so that it matches "abcde", "abcxe", "abc9e", but not "abceq"); (2) on that line, change the first "ab" to an "xx". Edit file 'county'; find the line with 'pacific' on it and change it to 'ocean'. Then rewrite the file and type "ready". #create Ref passaic bergen sussex hudson essex warren morris hunderdon somerset union ocean monmouth middlesex mercer cumberland cape may #create county passaic bergen sussex hudson essex warren morris hunderdon somerset union pacific monmouth middlesex mercer cumberland cape may #user #cmp county Ref #log #next 51.1a 10 50.2e 5 eL50.2c p#print Edit file "junk" and print the first line that contains either "color" or "Color". Then leave the editor and type "ready". #create junk this file contains a few random lines much noise bright Colors other stuff colored paper and color by Technicolor #create x2 bright Colors #copyout #user #uncopyout grep olor .ocopy >x1 #cmp x1 x2 #log #next 50.2d 5 50.1c 10 L50.2d X#print In file "text" print the first line which contains any of the words "them", "these", "their", or "there" (you need only distinguish "the"; that is, look for the letters "t", "h", and "e" followed by something other than a blank). Delete the line you find ; then rewrite the file and type "ready". #create Ref the leaves do not have enough room to hold all the food that plants make. much of the food has to be stored in remote parts of the plant. we eat the parts of plants where the most food is stored. the carrot plant stores food in its roots. We eat the roots of carrots. the celery plant stores food in its leaf stalks, which are the parts the fruits of these plants to get the stored food in them. some kinds of plants have ways of protecting their stored food. #create text the leaves do not have enough room to hold all the food that plants make. much of the food has to be stored in remote parts of the plant. we eat the parts of plants where the most food is stored. the carrot plant stores food in its roots. We eat the roots of carrots. the celery plant stores food in its leaf stalks, which are the parts we eat. many kinds of plants store food in their fruits. we eat the fruits of these plants to get the stored food in them. some kinds of plants have ways of protecting their stored food. #user #cmp text Ref #log #next 50.1c 10 L50.2e #print Please edit a file named "news" and find the first word containing the three letters "ufa". Make the word plural, rewrite the file, and type "ready". #create Ref It was announced today in Washington that the GNP was up at an annual rate of 8.2 % in the third quarter of 1975. Fishing and agriculture declined slightly but manufactures increased substantially. The overall gain was impressive and confirms economic recovery. #create news It was announced today in Washington that the GNP was up at an annual rate of 8.2 % in the third quarter of 1975. Fishing and agriculture declined slightly but manufacture increased substantially. The overall gain was impressive and confirms economic recovery. #user #cmp news Ref #log #next 50.2f 10 uL50.2f #print Look in the file "story". Somewhere is a line containing the word "season". Find it, and find what line number it has. Leave the editor and type "answer N" where N is the line number of the line containing the word "season". The file is too long for you to print it all, by the way. #create story All of the Big Cats, as well as the lesser ones, have wonderful eyes. They can see clearly even on a dark night. this is because of the way they are made. There is a sort of window in each eye. This window is called the pupil. It is black and is placed in the center of the colored part of the eye. The pupil lets light come in and reach a kind of mirror at the back of each eye. These mirrors reflect everything that is in front of the eyes. Right away a special nerve carries these reflected pictures to the brain. I'm learning to be a detective -- not the kind who solves crimes from fingerprints, pieces of clothing, or the cross-examining of witnesses -- I'm learning to be a nature detective. The mysteries I trace happen in the woods, in the park, and in my own backyard. Animals come and go when I'm not there to see them, but usually they leave clues behind. From such clues and other animal signs, you and I will piece together some exciting stories. We will detect which animals went where, what they did, and sometimes what they ate. Whenever there is snow on the ground, you are sure to find track stories written in it. Animals travel by air by water and by land. Some run very fast. Some hop or jump along the ground. Others walk more slowly, or crawl still more slowly. Do you know that plants are travelers, too? And that they also travel by land, by water and by air? Most plants stay in the same spot from the time they begin to grow until they die. But the next season you find many of them growing in new places. How do they get there? Some plants travel by land. They have seeds that fall to the ground and grow there. Others send out offshoots or sprouts which start new plants nearby. #copyin #user #uncopyin #match 286 #log #next 50.2g 10 oL50.2g `#print The file "amend" contains an erroneous copy of the first four amendments to the Constitution. Find the line saying "suspicion" and change it to read "but upon probable cause, supported by oath or affirmation," and then rewrite the file and type "ready". #create Ref 1. Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances. 2. A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear arms shall not be infringed. 3. No Soldier shall, in time of peace, be quartered in any house without the consent of the Owner, nor in time of war, but in a manner to be prescribed by law. 4. The right of the people to be secure in their persons, houses, papers, and effects, against unreasonable searches and seizures, shall not be violated, and no Warrants shall issue, but upon probable cause, supported by oath or affirmation, and particularly describing the place to be searched, and the persons or things to be seized. #create amend 1. Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances. 2. A well regulated Militia, being necessary to the security of a free State, the right of the people to keep and bear arms shall not be infringed. 3. No Soldier shall, in time of peace, be quartered in any house without the consent of the Owner, nor in time of war, but in a manner to be prescribed by law. 4. The right of the people to be secure in their persons, houses, papers, and effects, against unreasonable searches and seizures, shall not be violated, and no Warrants shall issue, but upon suspicion, and particularly describing the place to be searched, and the persons or things to be seized. #user #cmp amend Ref #log #next 51.1a 10 51.2a 5 L51.1a A#print You can also use relative addresses of the +1 or -1 sort with context searches. For example, to print the line after a line containing "cat", you can say /cat/+1p How would you print the line before the next line containing the word "help" at the beginning of the line? Try some experiments if you want, but in the end type "answer COMMAND" where COMMAND is the correct command to do that. #copyin #user #uncopyin #match /^help/-1p #match /^help/-1 #match /^help/- #match /^help/-p #succeed The "p" isn't necessary, of course. #cmp X1 X2 #log #next 52.1a 10 52.2a 5 iL51.2a #print You can also use relative addresses of the +1 or -1 sort with context searches. For example, to print the line after the line containing "cat", you could say /cat/+1p Here is a file "text". Print the line before the line containing "florin". Then leave the editor and type "ready". #create text The United Netherlands are a confederacy of republics, or rather of aristocracies of a very remarkable texture, yet confirming all the lessons derived from those which we have already reviewed. The union is composed of seven coequal and sovereign states, and each state or province is a composition of equal and independent cities. In all important cases, not only the provinces but the cities must be unanimous. The sovereignty of the union is represented by the States-General, consisting usually of about fifty deputies appointed by the provinces. They hold their seats, some for life, some for six, three, and one years; from two provinces they continue in appointment during pleasure. The States-General have authority to enter into treaties and alliances; to make war and peace; to raise armies and equip fleets; to ascertain quotas and demand contributions. In all these cases, however, unanimity and sanction of their constituents are requisite. They have authority to appoint and receive ambassadors; to execute treaties and alliances already formed; to provide for the collection of duties on imports and exports; to regulate the mint with a saving to the provincial rights; to govern as sovereigns the dependent territories. The provinces are restrained, unless with the general consent, from entering into foreign treaties; from establishing imposts injurious to others, or charging their neighbors with higher duties than their own subjects. A council of state, a chamber of accounts, with five colleges of admiralty, aid and fortify the federal administration. The executive magistrate of the Union is the stadtholder, who is now an hereditary prince. His principal weight and influence in the republic are derived from his independent title; from his great patrimonial estates; from his family connections with some of the chief potentates of Europe; and, more that all, perhaps, from his being stadtholder in the several provinces, as well as for the Union; in which provincial quality he has the appointment of town magistrates under certain regulations, executes provincial decrees, presides when he pleases in the provincial tribunals, and has throughout the power of pardon. As stadtholder of the Union, he has, however, considerable prerogatives. In his political capacity he has authority to settle disputes between the provinces, when other methods fail; to assist at the deliberations of the States-General and at their particular conferences; to give audiences to foreign ambassadors and to keep agents for his particular affairs at foreign courts. In his military capacity he commands the federal troops, provides for garrisons, and in general regulates military affairs; disposes of all appointments, from colonels to ensigns, and of the governments and posts of fortified towns. In his marine capacity he is admiral-general and superintends and directs every thing relative to naval forces and other naval affairs; presides in the admiralties in person or by proxy; appoints lieutenant-admirals and other officers; and establishes councils of war, whose sentences are not executed till he approves them. His revenue, exclusive of his private income, amounts to 300,000 florins. The standing army which he commands consists of about 40,000 men. #create x2 His revenue, exclusive of his private income, amounts #copyout #user #uncopyout grep exclusive .ocopy >x1 #cmp x1 x2 #log #next 51.2b 5 cL51.2b ] a#print Suppose you have a memo in a file and the line with the title is preceded by a line with "TL" on it. What command would print the title? Reply answer COMMAND where COMMAND is the search-and-print command to do that. #copyin #user #uncopyin #match /TL/+1p #match /TL/+ #match /TL/1 #match /TL/1p #match /TL/+p #match /TL/+1 #log #next 51.2c 5 nL51.2c #print How would you look for a blank line? Do you understand /^$/p Note this command: it looks for the beginning of the line, followed immediately by the end of the line. If there are any characters in between, it will keep looking for a line with no__ characters at all. All right. The file "text" contains an extraneous blank line. Delete it and rewrite the file. #create Ref When the people of America reflect that they are now called upon to decide a question, which in its consequences must prove one of the most important that ever engaged their attention, the propriety of their taking a very comprehensive, as well as a very serious, view of it will be evident. Nothing is more certain than the indispensable necessity of government; and it is equally undeniable that whenever and however it is instituted, the people must cede to it some of their natural rights, in order to vest it with requisite powers. It is well worthy of consideration, therefore, whether it would conduce more to the interest of the people of America that they should, to all general purposes, be one nation, under one federal government, than that they should divide themselves into separate confederacies and give to the head of each the same kind of powers which they are advised to place in one national government. It has until lately been a received and uncontradicted opinion that the prosperity of the people of America depended on their continuing firmly united, and the wishes, prayers, and efforts of our best and wisest citizens have been constantly directed to that object. But politicians now appear who insist that this opinion is erroneous, and that instead of looking for safety and happiness in union, we ought to seek it in a division of the States into distinct confederacies or sovereignties. However extraordinary this new doctrine may appear, it nevertheless has its advocates; and certain characters who were much opposed to it formerly are at present of the number. Whatever may be the arguments or inducements which have wrought this change in the sentiments and declarations of these gentlemen, it certainly would not be wise in the people at large to adopt these new political tenets without being fully convinced that they are founded in truth and sound policy. #create text When the people of America reflect that they are now called upon to decide a question, which in its consequences must prove one of the most important that ever engaged their attention, the propriety of their taking a very comprehensive, as well as a very serious, view of it will be evident. Nothing is more certain than the indispensable necessity of government; and it is equally undeniable that whenever and however it is instituted, the people must cede to it some of their natural rights, in order to vest it with requisite powers. It is well worthy of consideration, therefore, whether it would conduce more to the interest of the people of America that they should, to all general purposes, be one nation, under one federal government, than that they should divide themselves into separate confederacies and give to the head of each the same kind of powers which they are advised to place in one national government. It has until lately been a received and uncontradicted opinion that the prosperity of the people of America depended on their continuing firmly united, and the wishes, prayers, and efforts of our best and wisest citizens have been constantly directed to that object. But politicians now appear who insist that this opinion is erroneous, and that instead of looking for safety and happiness in union, we ought to seek it in a division of the States into distinct confederacies or sovereignties. However extraordinary this new doctrine may appear, it nevertheless has its advocates; and certain characters who were much opposed to it formerly are at present of the number. Whatever may be the arguments or inducements which have wrought this change in the sentiments and declarations of these gentlemen, it certainly would not be wise in the people at large to adopt these new political tenets without being fully convinced that they are founded in truth and sound policy. #user #cmp Ref text #log #next 52.1a 10 52.2a 5 L52.1a 5 #print A very powerful tool is to use pairs of addresses which include searches. For example, to print all lines from the present line to the next line containing "stop", say .,/stop/p (remember that "." is the present line). In this directory is a file "outline". Find the line that begins "B.3.i". Note that this line, and the next few lines, should begin "A..." for consistency. (Print the whole file to see what's wrong). Change all lines from this line to the line beginning "B.3.v" to begin "A.3". Then rewrite the file and type "ready". #create Ref First section A.1.i Introduction A.1.ii Definitions Second section A.2.i Scope A.2.ii Date effective A.2.iii Who covered Third section A.3.i Governing committee A.3.ii Chairman's election A.3.iii Board terms A.3.iv Board elections A.3.v Removal procedure Fourth section A.4.i Meetings A.4.ii Place of meeting A.4.iii Frequency of meetings Fifth section A.5.i Record keeping A.5.ii Corresponding secretary A.5.iii Recording secretary A.5.iv Financial records #create outline First section A.1.i Introduction A.1.ii Definitions Second section A.2.i Scope A.2.ii Date effective A.2.iii Who covered Third section B.3.i Governing committee B.3.ii Chairman's election B.3.iii Board terms B.3.iv Board elections B.3.v Removal procedure Fourth section A.4.i Meetings A.4.ii Place of meeting A.4.iii Frequency of meetings Fifth section A.5.i Record keeping A.5.ii Corresponding secretary A.5.iii Recording secretary A.5.iv Financial records #user #cmp outline Ref #succeed You got it right: I hope you found that the easiest way to change the file would be with the commands /B.3.i/p .,/B.3.v/s/B/A/ or some such series. #log #next 52.1b 10 L52.1b #print Even more powerful is to use two context searches for the pair of addresses in front of a command. For example /abc/,/def/p will print all lines from the one that contains "abc" to the one that contains "def". In this directory is a file "phone". On every line between "Pinson" and "Johnson" change "tel" to "ext". (Again, print the whole file first to see what's going on here and why the file is bad.) Then rewrite the corrected file and type "ready". #create Ref telephone numbers McIlroy M D ext 6050 Aho A V ext 4862 Baker B S ext 6503 Cherry L L ext 6067 Knowlton K ext 2328 Morris R ext 3878 Ossanna J F ext 3520 Thompson K ext 2394 Pinson E N ext 2582 Bourne S R ext 7419 Elliot R J ext 2879 Fraser A G ext 3685 Johnson S C ext 3968 Kernighan B W ext 6021 Ritchie D M ext 3770 Vollaro J R ext 6321 #create phone telephone numbers McIlroy M D ext 6050 Aho A V ext 4862 Baker B S ext 6503 Cherry L L ext 6067 Knowlton K ext 2328 Morris R ext 3878 Ossanna J F ext 3520 Thompson K ext 2394 Pinson E N tel 2582 Bourne S R tel 7419 Elliot R J tel 2879 Fraser A G tel 3685 Johnson S C tel 3968 Kernighan B W ext 6021 Ritchie D M ext 3770 Vollaro J R ext 6321 #user #cmp phone Ref #log #next 53.1a 10 52.2c 5 aL52.2a #print You can use pairs of addresses which involve searches. For example, to print all lines from the first line until the next line containing "stop", say 1,/stop/p In this directory is a file "list". Print all lines from the first line to a line containing "023". Then leave the editor and type "ready". #create list bio011 bio012 bio013 bio014 bio015 bio016 bio017 bio021 bio022 bio023 bio024 bio025 bio026 bio027 bio028 bio031 bio032 bio033 bio034 bio035 bio036 bio037 bio038 bio041 bio042 bio043 bio044 bio045 bio046 bio047 bio051 #create x2 bio011 bio012 bio013 bio014 bio015 bio016 bio017 bio021 bio022 bio023 #copyout #user #uncopyout grep bio .ocopy >x1 #cmp x1 x2 #log #next 52.2b 5 L52.2b [5 4#print In this directory is a file "outline". Find the line that begins "B.3.i". Note that this line, and the next few lines, should begin "A"... for consistency. (Print the whole file to see what is going on. It's fairly short.) Change all lines from the line beginning "B.3.i" to the line beginning "B.3.v" to begin "A.3". Then rewrite the file and type "ready". #create Ref First section A.1.i Introduction A.1.ii Definitions Second section A.2.i Scope A.2.ii Date effective A.2.iii Who covered Third section A.3.i Governing committee A.3.ii Chairman's election A.3.iii Board terms A.3.iv Board elections A.3.v Removal procedure Fourth section A.4.i Meetings A.4.ii Place of meeting A.4.iii Frequency of meetings Fifth section A.5.i Record keeping A.5.ii Corresponding secretary A.5.iii Recording secretary A.5.iv Financial records #create outline First section A.1.i Introduction A.1.ii Definitions Second section A.2.i Scope A.2.ii Date effective A.2.iii Who covered Third section B.3.i Governing committee B.3.ii Chairman's election B.3.iii Board terms B.3.iv Board elections B.3.v Removal procedure Fourth section A.4.i Meetings A.4.ii Place of meeting A.4.iii Frequency of meetings Fifth section A.5.i Record keeping A.5.ii Corresponding secretary A.5.iii Recording secretary A.5.iv Financial records #user #cmp outline Ref #succeed You got it right: I hope you found that the easiest way to change the file would be with the commands /B.3.i/p .,/B.3.v/s/B/A/ or some such series. #log #next 52.1b 10 L52.2c F#print In this directory is a file "memo". Between the line containing "I." and the line containing "II." change all multiple blanks to one blank. Then rewrite the file and type "ready". #create Ref .TL The Time Has Come .AU Joe Idiot .AI Bell Labs Murray Hill, NJ 07974 .SH I. Introduction .PP This document describes the problems of designing complex systems without adequately trained manpower. The solution adopted was to trick 90% of the staff into thinking they were working on the system when in fact they were not. This let the remaining 1:0% of the staff actually get the thing built. .SH II. Details .PP The project began on June 1, 1974. It was completed on Sept. 1, 1975 and has worked successfully since then. #create memo .TL The Time Has Come .AU Joe Idiot .AI Bell Labs Murray Hill, NJ 07974 .SH I. Introduction .PP This document describes the problems of designing complex systems without adequately trained manpower. The solution adopted was to trick 90% of the staff into thinking they were working on the system when in fact they were not. This let the remaining 1:0% of the staff actually get the thing built. .SH II. Details .PP The project began on June 1, 1974. It was completed on Sept. 1, 1975 and has worked successfully since then. #user #cmp memo Ref #log #next 53.1a 10 L53.1a #print Note that the // searches always go forward. Sometimes you want to go backward, to find some expression on a line before the one you are now working on. In that case you can search with a command like ?abc?p which prints the nearest preceding line which contains 'abc'. What command would print the nearest previous line that ends in "cat"? Type "answer COMMAND" when you figure it out. #copyin #user #uncopyin #match ?cat$?p The "p" isn't needed, but use it if you like too. #match ?cat$? #cmp X1 X2 #log #next 54.1a 10 53.2b 7 rL53.2b & I#print There is a big file "federal" in this directory. It contains the following mistyped words: Typed as Should be cotnend contend aalarm alarm exedient expedient drabel durable ugdes judges trame trample viws views Fix things up, rewrite the file, and then type "ready". #create Ref Among the numerous advantages promised by a well-constructed Union, none deserves to be more accurately developed than its tendency to break and control the violence of faction. The friend of popular governments never finds himself so much alarmed for their character and fate as when he contemplates their propensity to this dangerous vice. He will not fail, therefore, to set a due value on any plan which, without violating the principles to which he is attached, provides a proper cure for it. The instability, injustice, and confusion introduced into the public councils have, in truth, been the mortal diseases under which popular governments have everywhere perished, as they continue to be the favorite and fruitful topics from which the adversaries to liberty derive their most specious declamations. The valuable improvements made by the American constitutions on the popular models, both ancient and modern, cannot certainly be too much admired; but it would be an unwarrantable partiality to contend that they have as effectually obviated the danger on this side, as was wished and expected. Complaints are everywhere heard from our most considerate and virtuous citizens, equally the friends of public and private faith and of public and personal liberty, that out governments are too unstable, that the public good is disregarded in the conflicts of rival parties, and that measures are too often decided, not according to the rules of justice and the rights of the minor party, but by the superior force of an interested and overbearing majority. However anxiously we may wish that these complaints had no foundation, the evidence of known facts will not permit us to deny that they are in some degree true. It will be found, indeed, on a candid review of our situation, that some of the distresses under which we labor have been erroneously charged on the operation of our governments; but it will be found, at the same time, that other causes will not alone account for many of our heaviest misfortunes; and, particularly, for that prevailing and increasing distrust of public engagements and alarm for private rights which are echoed from one end of the continent to the other. These must be chiefly, if not wholly, effects of the unsteadiness and injustice with which a factious spirit has tainted out public administration. By a faction I understand a number of citizens, whether amounting to a majority or minority of the whole, who are united and actuated by some common impulse of passion, or of interest, adverse to the rights of other citizens, or to the permanent and aggregate interests of the community. There are two methods of curing the mischiefs of faction: The one, by removing its causes; the other, by controlling its effects. There are again two methods of removing the causes of faction: The one, by destroying the liberty which is essential to its existence; The other, by giving to every citizen the same opinions, the same passions, and the same interests. It could never be more truly said than of the first remedy that it was worse than the disease. Liberty is to faction what air is to fire, an ailment without which it instantly expires. But it could not be less folly to abolish liberty, which is essential to political life, because it nourishes faction than it would be to wish the annihilation of air, which is essential to animal life, because it imparts to dire its destructive agency. The second expedient is as impracticable as the first would be unwise. As long as the reason of man continues fallible, and he is at liberty to exercise it, different opinions will be formed. As long as the connection subsists between his reason and his self-love, his opinions and his passions will have a reciprocal influence on each other; and the former will be objects to which the latter will attach themselves. The diversity in the faculties of men, from which the rights of property originate, is not less an insuperable obstacle to the uniformity of interests. The protection of these faculties is the first object of government. From the protection of different and unequal faculties of acquiring property, the possession of different degrees and kinds of property immediately results; and from the influence of these on the sentiments and views of the respective proprietors ensues a division of the society into different interests and parties. The latent causes of faction are thus sown in the nature of man; and we see them everywhere brought into different degrees of activity, according to the different circumstances of civil society. A zeal for different opinions concerning religion, concerning government, and many other points, as well of speculation as of practice; an attachment to different leaders ambitiously contending for pre-eminence and power; or to persons of other descriptions whose fortunes have been interesting to the human passions, have, in turn, divided mankind into parties, inflamed them with mutual animosity, and rendered them much more disposed to vex and oppress each other than to co-operate for their common goal. So strong is this propensity of mankind to fall into mutual animosities that where no substantial occasion presents itself the most frivolous and fanciful distinctions have been sufficient to kindle their unfriendly passions and excite their most violent conflicts. But the most common and durable source of factions has been the verious and unequal distribution of property. Those who hold and those who are without property have ever formed distinct interests in society. Those who are creditors, and those who are debtors, fall under a like discrimination. A landed interest, a manufacturing interest, a mercantile interest, a moneyed interest, with many lesser interests, grow up of necessity in civilized nations, and divided them into different classes, actuated by different sentiments and views. The regulation of these various and interfering interests involves the spirit of party and faction in the necessary and ordinary operations of government. No man is allowed to be a judge in has own cause, because his interest would certainly bias his judgement, and, not improbably, corrupt his integrity. With equal, nay with greater reason, a body of men are unfit to be both judges and parties at the same time; yet what are many of the most important acts of legislation but so many judicial determinations, not indeed concerning the rights of single person, but concerning the rights of large bodies of citizens? And what are the different classes of legislators but advocates and parties to the causes which they determine? Is a law proposed concerning private debts? It is a question to which the creditors are parties one one side and the debtors on the other. Justice ought to hold the balance between them. Yet the parties are, and must be, themselves the judges; and the most numerous party, or in other words, the most powerful faction must be expected to prevail. Shall domestic manufacturers be encouraged, and in what degree, by restrictions on foreign manufacturers? are questions which would be differently decided by the landed and the manufacturing classes, and probably by neither with a sole regard to justice and the public good. The apportionment of taxes on the various descriptions of property is an act which seems to require the most exact impartiality; yet there is, perhaps, no legislative act in which greater opportunity and temptation are given to a predominant party to trample on the rules of justice. Every shilling with which they overburden the inferior number is a shilling saved to their own pockets. It is in vain to say that enlightened statesmen will be able to adjust these clashing interests and render them all subservient to the public good. Enlightened statesmen will not always be at the helm. Nor, in many cases, can such an adjustment be made at all without taking into view indirect and remote considerations, which will rarely prevail over the immediate interest which one party may find in disregarding the rights of another or the good of the whole. The inference to which we are brought is that the causes of faction cannot be removed and that relief is only to be sought in the means of controlling its effects. If a faction consists of less than a majority, relief is supplied by the republican principle, which enables the majority to defeat its sinister views by regular vote. It may clog the administration, it may convulse the society; But it will be unable to execute and mask its violence under the forms of the Constitution. When a majority is included in a faction, The form of popular government, on the other hand, enables it to sacrifice to its ruling passion or interest both the public good and the rights of other citizens. To secure the public good and private rights against the danger of such a faction, and at the same time to preserve the spirit and form of popular government, is than the great object to which our inquiries are directed. Let me add that it is the great desideratum by which alone this form of government can be rescued from the opprobrium under which it has so long labored and be recommended to the esteem and adoption of mankind. #create federal Among the numerous advantages promised by a well-constructed Union, none deserves to be more accurately developed than its tendency to break and control the violence of faction. The friend of popular governments never finds himself so much alarmed for their character and fate as when he contemplates their propensity to this dangerous vice. He will not fail, therefore, to set a due value on any plan which, without violating the principles to which he is attached, provides a proper cure for it. The instability, injustice, and confusion introduced into the public councils have, in truth, been the mortal diseases under which popular governments have everywhere perished, as they continue to be the favorite and fruitful topics from which the adversaries to liberty derive their most specious declamations. The valuable improvements made by the American constitutions on the popular models, both ancient and modern, cannot certainly be too much admired; but it would be an unwarrantable partiality to cotnend that they have as effectually obviated the danger on this side, as was wished and expected. Complaints are everywhere heard from our most considerate and virtuous citizens, equally the friends of public and private faith and of public and personal liberty, that out governments are too unstable, that the public good is disregarded in the conflicts of rival parties, and that measures are too often decided, not according to the rules of justice and the rights of the minor party, but by the superior force of an interested and overbearing majority. However anxiously we may wish that these complaints had no foundation, the evidence of known facts will not permit us to deny that they are in some degree true. It will be found, indeed, on a candid review of our situation, that some of the distresses under which we labor have been erroneously charged on the operation of our governments; but it will be found, at the same time, that other causes will not alone account for many of our heaviest misfortunes; and, particularly, for that prevailing and increasing distrust of public engagements and aalarm for private rights which are echoed from one end of the continent to the other. These must be chiefly, if not wholly, effects of the unsteadiness and injustice with which a factious spirit has tainted out public administration. By a faction I understand a number of citizens, whether amounting to a majority or minority of the whole, who are united and actuated by some common impulse of passion, or of interest, adverse to the rights of other citizens, or to the permanent and aggregate interests of the community. There are two methods of curing the mischiefs of faction: The one, by removing its causes; the other, by controlling its effects. There are again two methods of removing the causes of faction: The one, by destroying the liberty which is essential to its existence; The other, by giving to every citizen the same opinions, the same passions, and the same interests. It could never be more truly said than of the first remedy that it was worse than the disease. Liberty is to faction what air is to fire, an ailment without which it instantly expires. But it could not be less folly to abolish liberty, which is essential to political life, because it nourishes faction than it would be to wish the annihilation of air, which is essential to animal life, because it imparts to dire its destructive agency. The second exedient is as impracticable as the first would be unwise. As long as the reason of man continues fallible, and he is at liberty to exercise it, different opinions will be formed. As long as the connection subsists between his reason and his self-love, his opinions and his passions will have a reciprocal influence on each other; and the former will be objects to which the latter will attach themselves. The diversity in the faculties of men, from which the rights of property originate, is not less an insuperable obstacle to the uniformity of interests. The protection of these faculties is the first object of government. From the protection of different and unequal faculties of acquiring property, the possession of different degrees and kinds of property immediately results; and from the influence of these on the sentiments and views of the respective proprietors ensues a division of the society into different interests and parties. The latent causes of faction are thus sown in the nature of man; and we see them everywhere brought into different degrees of activity, according to the different circumstances of civil society. A zeal for different opinions concerning religion, concerning government, and many other points, as well of speculation as of practice; an attachment to different leaders ambitiously contending for pre-eminence and power; or to persons of other descriptions whose fortunes have been interesting to the human passions, have, in turn, divided mankind into parties, inflamed them with mutual animosity, and rendered them much more disposed to vex and oppress each other than to co-operate for their common goal. So strong is this propensity of mankind to fall into mutual animosities that where no substantial occasion presents itself the most frivolous and fanciful distinctions have been sufficient to kindle their unfriendly passions and excite their most violent conflicts. But the most common and drabel source of factions has been the verious and unequal distribution of property. Those who hold and those who are without property have ever formed distinct interests in society. Those who are creditors, and those who are debtors, fall under a like discrimination. A landed interest, a manufacturing interest, a mercantile interest, a moneyed interest, with many lesser interests, grow up of necessity in civilized nations, and divided them into different classes, actuated by different sentiments and views. The regulation of these various and interfering interests involves the spirit of party and faction in the necessary and ordinary operations of government. No man is allowed to be a judge in has own cause, because his interest would certainly bias his judgement, and, not improbably, corrupt his integrity. With equal, nay with greater reason, a body of men are unfit to be both ugdes and parties at the same time; yet what are many of the most important acts of legislation but so many judicial determinations, not indeed concerning the rights of single person, but concerning the rights of large bodies of citizens? And what are the different classes of legislators but advocates and parties to the causes which they determine? Is a law proposed concerning private debts? It is a question to which the creditors are parties one one side and the debtors on the other. Justice ought to hold the balance between them. Yet the parties are, and must be, themselves the judges; and the most numerous party, or in other words, the most powerful faction must be expected to prevail. Shall domestic manufacturers be encouraged, and in what degree, by restrictions on foreign manufacturers? are questions which would be differently decided by the landed and the manufacturing classes, and probably by neither with a sole regard to justice and the public good. The apportionment of taxes on the various descriptions of property is an act which seems to require the most exact impartiality; yet there is, perhaps, no legislative act in which greater opportunity and temptation are given to a predominant party to trame on the rules of justice. Every shilling with which they overburden the inferior number is a shilling saved to their own pockets. It is in vain to say that enlightened statesmen will be able to adjust these clashing interests and render them all subservient to the public good. Enlightened statesmen will not always be at the helm. Nor, in many cases, can such an adjustment be made at all without taking into view indirect and remote considerations, which will rarely prevail over the immediate interest which one party may find in disregarding the rights of another or the good of the whole. The inference to which we are brought is that the causes of faction cannot be removed and that relief is only to be sought in the means of controlling its effects. If a faction consists of less than a majority, relief is supplied by the republican principle, which enables the majority to defeat its sinister viws by regular vote. It may clog the administration, it may convulse the society; But it will be unable to execute and mask its violence under the forms of the Constitution. When a majority is included in a faction, The form of popular government, on the other hand, enables it to sacrifice to its ruling passion or interest both the public good and the rights of other citizens. To secure the public good and private rights against the danger of such a faction, and at the same time to preserve the spirit and form of popular government, is than the great object to which our inquiries are directed. Let me add that it is the great desideratum by which alone this form of government can be rescued from the opprobrium under which it has so long labored and be recommended to the esteem and adoption of mankind. #user #cmp federal Ref #log #next 54.1a 10 oL54.1a ( #print A time-saving feature of context searches is that the editor remembers the last regular expression mentioned, and if you just say // or ?? with no expression, it assumes the same one. Thus /abc/s//def/ searches for a line with 'abc', and, on finding it, changes the 'abc' to 'def'. Similarly /qqq/s/// finds a 'qqq' and then throws it away, as if the command were /qqq/s/qqq// In this directory is a file 'error' which contains "servixe" as a mistyping for "service". Find the bad instance and fix it, if possible with one command. Then rewrite the file and type 'ready'. #create Ref This file contains many copies of the word service but in all of those lines with service in them the next line has a service that is spelled wrong unlike the other services. #create error This file contains many copies of the word service but in all of those lines with service in them the next line has a servixe that is spelled wrong unlike the other services. #user #cmp error Ref #log #next 55.1a 10 54.1b 8 L54.1b ݕ a#print The fact that the system remembers the last regular expression it had is particularly useful when the regular expression is complex. Suppose, for example, you know that the words "first" and "second" appear on the same line and you wish to delete them and everything between them. You could write /first.*second/s/first.*second//p but isn't it easier to do /first.*second/s///p Edit the file "passage"; the words "twentieth" and "impending" appear on the same line. Replace them and everything between them by the word "impending" (i.e. delete from "twentieth" up to but not including "impending"). One command, if you can. Then rewrite the file and type ready. #create Ref America's rise to world power is a consequence of the nation's geographic position, natural resources, and dynamic energy. For the first century and more of national history, however, continental expansion and internal developments largely absorbed the energies of the American people. Every dictate of public interest emphasized the importance of avoiding all entanglements that might involve the young republic in foreign rivalries and foreign wars. Only with the impending shifts in the European balance of power, and the growth of American economic and industrial strength create a situation that made impossible a continued aloofness from international affairs. #create passage America's rise to world power is a consequence of the nation's geographic position, natural resources, and dynamic energy. For the first century and more of national history, however, continental expansion and internal developments largely absorbed the energies of the American people. Every dictate of public interest emphasized the importance of avoiding all entanglements that might involve the young republic in foreign rivalries and foreign wars. Only with the twentieth century did a rapidly contracting world, impending shifts in the European balance of power, and the growth of American economic and industrial strength create a situation that made impossible a continued aloofness from international affairs. #user #cmp passage Ref #log #next 55.1a 10 eL55.1a , #print This is an easy unit. If you just hit "newline" (or "carriage return", whatever it is labeled on your terminal), the editor will simply print the next line as you can see by trying this out. Edit the file "pres"; print some line; then hit return or newline, and watch the editor print the next line. Is there any difference between newline and ".+1p" as a command? When you think you know, leave the editor and type "yes" or "no". #create pres George Washington John Adams Thomas Jefferson James Madison James Monroe John Quincy Adams Andrew Jackson Martin van Buren William Henry Harrison John Tyler James K. Polk Franklin Pierce Millard Fillmore James Buchanan Abraham Lincoln #copyin #user #uncopyin #match no #log #next 56.1a 10 L56.1a #print Is there just as easy a way of printing the immediately preceding line? Not quite, but almost. The line - will print the line just before the line you are on. What's the equivalent command in terms of "." and "p"? Type "answer COMMAND" when you figure it out. Again, you can experiment first; the same file named "pres" is in this directory. #create pres George Washington John Adams Thomas Jefferson James Madison James Monroe John Quincy Adams Andrew Jackson Martin van Buren William Henry Harrison John Tyler James K. Polk Franklin Pierce Millard Fillmore James Buchanan Abraham Lincoln #copyin #user #uncopyin #match .-1p The "p" isn't needed. #match .-1 #log #next 57.1a 10 L57.1a . ;#print For symmetry, you can use + instead of either ".+1p" or an empty line (just a newline). The only advantage that + has is that you can repeat it: ++ prints the second following line, and +++ the third. The same is true of -. If the current line is line number 10, what line number is -- going to be? (Hint: you can find out by editing a file such as "pres", saying "10p", and then saying "--", and then saying ".=" - remember the "=" command?) When you find out, type "answer N" where N is the number. #create pres George Washington John Adams Thomas Jefferson James Madison James Monroe John Quincy Adams Andrew Jackson Martin van Buren William Henry Harrison John Tyler James K. Polk Franklin Pierce Millard Fillmore James Buchanan Abraham Lincoln #copyin #user #uncopyin #match 8 #log #next 60.1a 10 60.2a 5 (L6.1a K#print You may well ask how the editor knows which line to print. The editor keeps track of the 'current line', which is usually the last line you touched in any way. When you begin editing a file, for example, the current line is the last line. If you want to print any particular line, however, that is easy. For example, to print the 3rd line you say 3p To print the first line 1p (That's a one, no matter how much it looks like the letter "l".) Here is a file: I'll put you into the editor with that file as the 'current file' - print the 4th line, then type 'w', 'q', and 'ready' as usual. #create Ref james madison 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #print file #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X2 #cmp Ref X2 #log #next 7.1a 10 nL6.2a , #print How does the editor choose a line to print? It always remembers a 'current line', which is the last line of the file originally, but you can choose any line you want. The command 3p prints the third line of the file, for example. And 1p prints the first line. Note that is the digit one there, not the letter l, no matter how much alike they look. I'll put you into the editor with the file listed below: print the first line, then type 'w', 'q' and 'ready' as usual. #create Ref george washington 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #print file #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X2 #cmp Ref X2 #log #next 6.2b 5 L6.2b . ]#print Same thing again, but this time print the fifth line in the file. Then type "w", "q", and "ready". #create Ref james monroe 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #print file #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X2 #cmp Ref X2 #log #next 7.1a 10 L60.1a U #print So far you have always dealt with one file at a time. Suppose you wanted to combine two files - there is nothing we have covered so far that will do that. But the editor does have a command 'r' (read) r file which reads in the contents of "file" without throwing away what you already have. So that you can combine the files "cat" and "dog" (and name the result "animal") by saying ed r cat r dog w animal q In this directory are four files named for continents. Combine them into one file named "world". (Read the files in alphabetical order, as they are listed). You may want to list the input files and the combined files with "cat" to see what they look like. When done, type "ready" as usual. #create Ref This is file 'africa' and will be listed first. ------ this file will have to do for both american continents ----- File "asia" is indented two spaces. Europe's file is only one line long. #create africa This is file 'africa' and will be listed first. #create america ------ this file will have to do for both american continents ----- #create asia File "asia" is indented two spaces. #create europe Europe's file is only one line long. #user #cmp Ref world #log #next 60.1b 10 aL60.1b ! H#print You can, of course, use the 'r' command with an address. Any editor command can be used with an address (except 'q'). For example, there is a file 'phone' in this directory. If you print it, you'll see that one department is missing from the list; it is on file 'filler'. Edit 'phone'; read in 'filler' after the line saying '1273'. Then rewrite 'phone', leave the editor, and say "ready". #create Ref telephone numbers Department 1271 McIlroy M D ext 6050 Aho A V ext 4862 Baker B S ext 6503 Cherry L L ext 6067 Knowlton K ext 2328 Morris R ext 3878 Ossanna J F ext 3520 Thompson K ext 2394 Department 1273 Pinson E N ext 2582 Bourne S R ext 7419 Elliot R J ext 2879 Fraser A G ext 3685 Johnson S C ext 3968 Kernighan B W ext 6021 Ritchie D M ext 3770 Vollaro J R ext 6321 Department 1274 Brown W S ext 4822 Blue J L ext 6558 Feldman S I ext 2059 Hall A D ext 4006 Lesk M E ext 6377 Schryer N L ext 2912 Warner D D ext 2833 #create filler Pinson E N ext 2582 Bourne S R ext 7419 Elliot R J ext 2879 Fraser A G ext 3685 Johnson S C ext 3968 Kernighan B W ext 6021 Ritchie D M ext 3770 Vollaro J R ext 6321 #create phone telephone numbers Department 1271 McIlroy M D ext 6050 Aho A V ext 4862 Baker B S ext 6503 Cherry L L ext 6067 Knowlton K ext 2328 Morris R ext 3878 Ossanna J F ext 3520 Thompson K ext 2394 Department 1273 Department 1274 Brown W S ext 4822 Blue J L ext 6558 Feldman S I ext 2059 Hall A D ext 4006 Lesk M E ext 6377 Schryer N L ext 2912 Warner D D ext 2833 #user #cmp phone Ref #log #next 61.1a 10 L60.2a #print Suppose you wanted to combine two files? No editor command you have learned so far will do that. The command 'r' is just what the doctor ordered. It reads in a file, without throwing away the existing buffer. So, for example, ed para1 r para2 w both q will edit "para1"; then read in "para2" at the end; and then write the combined stuff on "both". Try that, with those names, in this directory. Then type "ready". #create Ref We say that matter is anything which occupies space and has weight. Matter possesses inertia, which is a resistance to change of position or motion. It may be acted on by forces which may set it in motion, or change its motion. While all these statements are descriptive of matter, they do not provide us with a completely satisfactory definition. Scientists, with their great knowledge of the properties and behavior of matter, are not yet able to define it precisely. Nature still holds many secrets to challenge the minds of men. The quantity of matter which a body possesses is known as its mass. When one end of a long glass tube that is open at both ends is placed in water, forces cause the water to rise in the tube to a certain height. The finer the bore of the tube, the higher the water rises. A tube with a hairlike bore is called a capillary tube and the liquid rise in it is called capillarity. How could you show that this rise is not due to atmospheric pressure? Seemingly, water rises in capillary tubes because the adhesive forces between glass and water molecules are greater than the cohesive forces between water molecules. #create para1 We say that matter is anything which occupies space and has weight. Matter possesses inertia, which is a resistance to change of position or motion. It may be acted on by forces which may set it in motion, or change its motion. While all these statements are descriptive of matter, they do not provide us with a completely satisfactory definition. Scientists, with their great knowledge of the properties and behavior of matter, are not yet able to define it precisely. Nature still holds many secrets to challenge the minds of men. The quantity of matter which a body possesses is known as its mass. #create para2 When one end of a long glass tube that is open at both ends is placed in water, forces cause the water to rise in the tube to a certain height. The finer the bore of the tube, the higher the water rises. A tube with a hairlike bore is called a capillary tube and the liquid rise in it is called capillarity. How could you show that this rise is not due to atmospheric pressure? Seemingly, water rises in capillary tubes because the adhesive forces between glass and water molecules are greater than the cohesive forces between water molecules. #user #cmp both Ref #log #next 60.2b 5 rL60.2b 5 1#print You can of course combine many files. Make a file "total" which contains the pieces "first", "second", "third", and "fourth" in that order. Then type "ready". #create Ref It has been already observed that the federal government ought to possess the power of providing for the support of the national forces; in which proposition was intended to be included the expense of raising troops, of building and equipping fleets, and all other expenses in any wise connected with military arrangements and operations. But these are not the only objects to which the jurisdiction of the Union in respect to revenue must necessarily be empowered to extend. It must embrace a provision for the support of the national civil list; for the payment of the national debts contracted, or that may be contracted; and, in general, for all those matters which will call for disbursements out of the national treasury. The conclusion is that there must be interwoven in the frame of the government a general power of taxation, in one shape or another. Money is, with propriety, considered as the vital principle of the body politic; as that which sustains its life and motion and enables it to perform its most essential functions. A complete power, therefore, to procure a regular and adequate supply of revenue, as far as the resources of the community will permit, may be regarded as an indispensable ingredient in every constitution. From a deficiency in this particular, one of two evils must ensue: either the people must be subjected to continual plunder, as a substitute for a more eligible mode of supplying the public wants, or the government must sink into a fatal atrophy, and, in a short course of time, perish. In the Ottoman or Turkish empire the sovereign, though in other respects absolute master of the lives and fortunes of his subjects, has no right to impose a new tax. The consequence is that he permits the bashaws or governors of provinces to pillage the people at discretion, and, in turn, squeezes out of them the sums of which he stands in need to satisfy his own exigencies and those of the state. In America, from a like cause, the government of the Union has gradually dwindled into a state of decay, approaching nearly to annihilation. Who can doubt that the happiness of the people in both countries would be promoted by competent authorities in the proper hands to provide the revenues which the necessities of the public might require? The present Confederation, feeble as it is, intended to repose in the United States an unlimited power of providing for the pecuniary wants of the Union. But proceeding upon an erroneous principle, it has been done in such a manner as entirely to have frustrated the intention. #create first It has been already observed that the federal government ought to possess the power of providing for the support of the national forces; in which proposition was intended to be included the expense of raising troops, of building and equipping fleets, and all other expenses in any wise connected with military arrangements and operations. But these are not the only objects to which the jurisdiction of the Union in respect to revenue must necessarily be empowered to extend. It must embrace a provision for the support of the national civil list; for the payment of the national debts contracted, or that may be contracted; and, in general, for all those matters which will call for disbursements out of the national treasury. The conclusion is that there must be interwoven in the frame of the government a general power of taxation, in one shape or another. #create fourth The present Confederation, feeble as it is, intended to repose in the United States an unlimited power of providing for the pecuniary wants of the Union. But proceeding upon an erroneous principle, it has been done in such a manner as entirely to have frustrated the intention. #create second Money is, with propriety, considered as the vital principle of the body politic; as that which sustains its life and motion and enables it to perform its most essential functions. A complete power, therefore, to procure a regular and adequate supply of revenue, as far as the resources of the community will permit, may be regarded as an indispensable ingredient in every constitution. From a deficiency in this particular, one of two evils must ensue: either the people must be subjected to continual plunder, as a substitute for a more eligible mode of supplying the public wants, or the government must sink into a fatal atrophy, and, in a short course of time, perish. #create third In the Ottoman or Turkish empire the sovereign, though in other respects absolute master of the lives and fortunes of his subjects, has no right to impose a new tax. The consequence is that he permits the bashaws or governors of provinces to pillage the people at discretion, and, in turn, squeezes out of them the sums of which he stands in need to satisfy his own exigencies and those of the state. In America, from a like cause, the government of the Union has gradually dwindled into a state of decay, approaching nearly to annihilation. Who can doubt that the happiness of the people in both countries would be promoted by competent authorities in the proper hands to provide the revenues which the necessities of the public might require? #user #cmp total Ref #next 60.2c 5 tL60.2c 8 v#print You can use an address on the 'r' command to read input at a particular location in the file. Thus 5r name reads file "name" and appends its contents after line 5 o f the file. You can use any kind of address, including a search. Here is a file "chem". Find the line in file "chem" which contains the word "eight"; read the file "more" and append it after that line. Then rewrite "chem" and type "ready". #create Ref When elements combine to form compounds, the electrons in the outermost shell of the atoms are the only ones that take part in the reaction. These electrons are either transferred from the outer shell of one atom to the outer shell of another, or, in some cases, shared with the electrons in the outer shell of the second atom. Whether the electrons are transfered to the second atom or shared, this atom completes its quota of eight electrons in the outer shell. An oxide is a compound containing oxygen and one other element. The simplest of the oxides is H2O -- pure water, or hydrogen oxide. Carbon dioxide is CO2 and is formed during the burning of organic matter such as wood, paper, gasoline, or coal. In the same burning process, H2O is formed and energy is released, generally as heat, sometimes as light. Carbon dioxide is in the breath you just exhaled. This gas is given off by decaying plant and animal matter. Decay is a burning process. Oxidation is a word that covers all the different ways things burn. When something oxidizes, it is burning. Compounds which are formed by the interchange of electrons are called ionic compounds. The ions formed are said to possess electrovalence. #create chem When elements combine to form compounds, the electrons in the outermost shell of the atoms are the only ones that take part in the reaction. These electrons are either transferred from the outer shell of one atom to the outer shell of another, or, in some cases, shared with the electrons in the outer shell of the second atom. Whether the electrons are transfered to the second atom or shared, this atom completes its quota of eight electrons in the outer shell. Compounds which are formed by the interchange of electrons are called ionic compounds. The ions formed are said to possess electrovalence. #create more An oxide is a compound containing oxygen and one other element. The simplest of the oxides is H2O -- pure water, or hydrogen oxide. Carbon dioxide is CO2 and is formed during the burning of organic matter such as wood, paper, gasoline, or coal. In the same burning process, H2O is formed and energy is released, generally as heat, sometimes as light. Carbon dioxide is in the breath you just exhaled. This gas is given off by decaying plant and animal matter. Decay is a burning process. Oxidation is a word that covers all the different ways things burn. When something oxidizes, it is burning. #user #cmp chem Ref #log #next 60.2d 5 L60.2d : #print This is trickier. Read the file "text". Look for a line saying "insert file ... here". Delete that line, and in its place (after the preceding line) read in the file asked for. Then rewrite "text" and type "ready". #create Ref The severity of the judicial and penal system was partly caused by the defects of the police. Only a small proportion of criminals were caught, and even when arrests were made, but little evidence was collected. The officers, so far from being scientific were not even properly professional. For although the constable of each village and the watchman of each town were paid to guard peace land property, they were yet neither specially fitted nor trained for that employment. In a country village the case was even worse. For there the magistrates could only afford to hire the part-service of a farmer-constable. It is a striking fact that until recently democracy never flourished except in very small states -- for the most part in cities. It is true that in both the Persian and the Roman empires a measure of self-government was accorded to local communities, but only in respect to purely local affairs; in no large state as a whole was democratic government found to be practicable. One essential reason is that until recently the means of communication were too slow and uncertain to create the necessary solidarity of interest and similarity of information over large areas. #create inside land property, they were yet neither specially fitted nor trained for that employment. In a country village the case was even worse. For there the magistrates could only afford to hire the part-service of a farmer-constable. It is a striking fact that until recently democracy never flourished except in very small states -- for the most part in cities. It is true that in both the Persian and the Roman empires a measure of self-government was accorded to local communities, but only in #create text The severity of the judicial and penal system was partly caused by the defects of the police. Only a small proportion of criminals were caught, and even when arrests were made, but little evidence was collected. The officers, so far from being scientific were not even properly professional. For although the constable of each village and the watchman of each town were paid to guard peace *** insert file "inside" here *** respect to purely local affairs; in no large state as a whole was democratic government found to be practicable. One essential reason is that until recently the means of communication were too slow and uncertain to create the necessary solidarity of interest and similarity of information over large areas. #user #cmp text Ref #log #next 61.1a 10 L61.1a m#print Note that usually you just type 'w' without a file name, and the editor buffer is written on the 'current file'. What is the 'current file' when you have executed an 'r' command? Well, it doesn't change. But rather than be in doubt, there is a command f which prints the current file name. You can change the current file name with f name so that you can copy file 'old' to 'new' with ed old f new w q Try that: copy file 'first' to 'second' in this directory. Then type "ready". #create first This is the file to be copied using the 'f' command. #user #cmp first second #log #next 62.1a 10 62.2a 5 eL62.1a ɛ Q#print Frequently you will want to move one or more lines from one place in a file to another. The command 5,10m30 will pick up lines 5 through 10 and move them after line 30. You can of course use context searches for addresses: /ab/,/cd/m/xx/ finds a line containing "ab", then one containing "cd", and moves the section of the file they bracket after the next line containing "xx". Or you can use ".", "$", etc.: .,.+2m$ moves the three lines starting at "." to the end. There is a file "word" which is out of order; re-arrange it to be alphabetical. #create Ref bands becomes course dissolve events for have human in it necessary of one people political the to when which #create word bands becomes course in it necessary of one people political dissolve events for have human the to when which #user #cmp word Ref #log #next 63.1a 10 fL62.2a > #print A very useful command in the UNIX editor is the 'm' command, which moves a lot of lines from one place to another in a file. For example, 5,10m20 picks up lines 5 through 10 and moves them after line 20. Try that on the file "list" in this directory: move lines 5 to 10 after line 20, rewrite the file, and type "ready". #create Ref computer languages fortran cobol snobol comit lex yacc c tmg ratfor basic bon bcpl algol 60 algol 68 pl/i pl/c pl/360 apl altran formac #create list computer languages fortran cobol algol 60 algol 68 pl/i pl/c pl/360 apl snobol comit lex yacc c tmg ratfor basic bon bcpl altran formac #user #cmp list Ref #log #next 62.2b 5 L62.2b @ f#print You can of course use any kind of addresses for the three addresses in the 'm' command. Think of the command as "from address-1 until address-2 gather up and MOVE to address-3". OK. In the file "story" move the lines from the line that contains "back" until the line containing "prevail" to the end of the file. Then rewrite "story" and type "ready". #create Ref Only twice in the nation's history has daylight-savings time been uniformly observed throughout the land -- during World War I, the first DST was tried, and again during World War II. Immediately after both wars, however, many areas abandoned DST altogether. Last week the House voted 292 to 93 to require all states to move their clocks ahead an hour on the last Sunday in April, and set them back again on the last Sunday in October -- unless a state legislature specifically votes to stay on standard time. In that case, local options are out and standard time must prevail through the state. #create story Only twice in the nation's history has daylight-savings time been uniformly observed throughout the land -- during World War I, the first DST was tried, and again during World War II. Immediately after both wars, however, many areas abandoned DST altogether. back again on the last Sunday in October -- unless a state legislature specifically votes to stay on standard time. In that case, local options are out and standard time must prevail through the state. Last week the House voted 292 to 93 to require all states to move their clocks ahead an hour on the last Sunday in April, and set them #user #cmp story Ref #log #next 62.2c 5 L62.2c B #print In this directory is a file "word" which should be in alphabetical order but is not; put it in order by picking up a block of lines and relocating them. Then rewrite the file and type "ready". #create Ref bands becomes course dissolve events for have human in it necessary of one people political the to when which #create word bands becomes course in it necessary of one people political dissolve events for have human the to when which #user #cmp word Ref #log #next 63.1a 10 L63.1a q#print Line 0 is a legitimate address for a few commands; you can append text at the beginning of a file by typing 0a and you can move lines to the beginning of a files by using m0 Move the last three lines of file "tax" to the beginning, then type "ready". #create Ref If you sustain an "overall foreign loss" for any taxable year, a recapture provision will treat a part of foreign income realized in a later year as income from U. S. sources. These rules generally apply to losses sustained in taxable years beginning after December 31, 1975. #create tax will treat a part of foreign income realized in a later year as income from U. S. sources. These rules generally apply to losses sustained in taxable years beginning after December 31, 1975. If you sustain an "overall foreign loss" for any taxable year, a recapture provision #user #cmp Ref tax #log #next 63.1b 10 aL63.1b #print What command will move the current line to the beginning of the file? Type "answer COMMAND", where COMMAND is the command. #copyin #user #uncopyin #match m0 #match .m0 "m0" is easier. #log #next 63.1c 10 iL63.1c # #print What command will move the current line to the end of the file? Type "answer COMMAND", where COMMAND is the command. #copyin #user #uncopyin #match m$ #match .m$ "m$" is easier. #log #next 63.1d 10 1L63.1d C #print Will the command m+ interchange lines "." and ".+1"? Answer yes or no. #copyin #user #uncopyin #match yes #log #next 63.1e 10 uL63.1e _ #print Will the command m- interchange lines "." and ".-1"? Answer yes or no. #copyin #user #uncopyin #match no You actually need "m--". #log #next 64.1a 10 L64.1a ɝ #print Another command similar to 'm' is 't'; the command 5,8t15 picks up lines 5 through 8 and makes a copy of them, which it places after line 15. It differs from 'm' only in that the lines remain in their old place as well as appearing in their new place. (Just like "cp" and "mv" with files). In this directory is a file "double". Using the editor, find the line containing "-------" and make a copy of it at the end of the file. #create Ref ------------ This file should be bracketed by the dashes but as it is given to you there are only dashes at the top. ------------ #create double ------------ This file should be bracketed by the dashes but as it is given to you there are only dashes at the top. #user #cmp double Ref #log #next 64.1b 10 tL64.1b # #print Another exercise in the effective use of the 't' command: What command should be typed to make a second copy of the current line? Type "answer XX", where XX is the command. #copyin #user #uncopyin #match t. #match .t. You could just say "t.". #log #next 65.1a 10 kL65.1a #print A strange, and not often important command, is the 'l' (list) command. When it is needed, though, it is vital. It is almost identical to 'p' (print) except that control characters (like tab or backspace) are printed in a way that lets you see what they are no matter what the terminal does. From time to time strange characters will sneak into your files; they won't show when you print them, and yet they will confuse you. For example, you might be unable to find a line by searching for it with /abc/ and yet it would print as "abc" if there were a funny character in the line between 'a' and 'b'. Funny characters are generated by hitting the control keys on the terminal; they print as '\' followed by a number. There is a file "weird" in this directory. Print it both with "1,$p" and "1,$l" and observe the difference. Then leave the editor. Which word on the last line has a funny character in it? Type "answer WORD" where WORD is that word (without the funny symbol). #create weird This line has tabs in it. So does this one. Here is a line with____ backspaces of a useful sort. These backspacesonlyconfuse matters. there's a strange character in this line even though it prints ok. #copyin #user #uncopyin #match this #log #next 66.1a 10 L66.1a F #print The file "memo" contains several paragraphs, where a paragraph starts at any line that begins with a blank. It is desired to remove those blanks at the beginning of lines, and instead mark the paragraphs by inserting a line containing only .PP before each paragraph. Change the file in that way and then rewrite it; then type "ready". #create Ref The Ascent of the Riffelberg by Mark Twain .PP I sat silent some time, then turned to Harris and said: ``My mind is made up.'' Something in my tone struck him; and when he glanced at my eye and read what was written there, his face paled perceptibly. He hesitated a moment, then said: ``Speak.'' .PP I answered, with perfect calmness: ``I WILL ASCEND THE RIFFELBERG.'' .PP If I had shot my poor friend he could not have fallen from his chair more suddenly. If I had been his father he could not have pleaded harder to get me to give up my purpose. But I turned a deaf ear to all he said. When he perceived at last that nothing could alter my determination, he ceased to urge, and for a while the deep silence was broken only by his sobs. I sat in marble resolution, with my eyes fixed upon vacancy, for in spirit I was already wrestling with the perils of the mountains, and my friend sat gazing at me in adoring admiration through his tears. At last he threw himself upon me in a loving embrace and exclaimed in broken tones: ``Your Harris will never desert you. We will die together!'' .PP I cheered the noble fellow with praises, and soon his fears were forgotten and he was eager for the adventure. He wanted to summon the guides at once and leave at two in the morning, as he supposed the custom was; but I explained that nobody was looking at that hour; and that the start in the dark was not usually made from the village but from the first night's resting-place on the mountainside. I said we would leave the village at 3 or 4 p.m. on the morrow; meantime he could notify the guides, and also let the public know of the attempt which we proposed to make. .PP I went to bed, but not to sleep. No man can sleep when he is about to undertake one of these Alpine exploits. I tossed feverishly all night long, and was glad enough when I heard the clock strike half past eleven and knew it was time to get up for dinner. #create memo The Ascent of the Riffelberg by Mark Twain I sat silent some time, then turned to Harris and said: ``My mind is made up.'' Something in my tone struck him; and when he glanced at my eye and read what was written there, his face paled perceptibly. He hesitated a moment, then said: ``Speak.'' I answered, with perfect calmness: ``I WILL ASCEND THE RIFFELBERG.'' If I had shot my poor friend he could not have fallen from his chair more suddenly. If I had been his father he could not have pleaded harder to get me to give up my purpose. But I turned a deaf ear to all he said. When he perceived at last that nothing could alter my determination, he ceased to urge, and for a while the deep silence was broken only by his sobs. I sat in marble resolution, with my eyes fixed upon vacancy, for in spirit I was already wrestling with the perils of the mountains, and my friend sat gazing at me in adoring admiration through his tears. At last he threw himself upon me in a loving embrace and exclaimed in broken tones: ``Your Harris will never desert you. We will die together!'' I cheered the noble fellow with praises, and soon his fears were forgotten and he was eager for the adventure. He wanted to summon the guides at once and leave at two in the morning, as he supposed the custom was; but I explained that nobody was looking at that hour; and that the start in the dark was not usually made from the village but from the first night's resting-place on the mountainside. I said we would leave the village at 3 or 4 p.m. on the morrow; meantime he could notify the guides, and also let the public know of the attempt which we proposed to make. I went to bed, but not to sleep. No man can sleep when he is about to undertake one of these Alpine exploits. I tossed feverishly all night long, and was glad enough when I heard the clock strike half past eleven and knew it was time to get up for dinner. #user #cmp memo Ref #log #next 70.1a 10 70.2a 5 iL7.1a _ #print Although specifying lines by line number is easy to understand, it is hard to do in a long file. You will therefore want to learn other ways of addressing lines. The 'current line' is addressed with the symbol . so that it can be printed, for example with .p just as you could print a line by "3p". Try that in this file; the current line is set to the last line of the current file. Try ".p"; then "w", "q", and "ready" as usual. Here's the full file - #create Ref john quincy adams 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #print file #copyout #pipe ed file #user #unpipe #uncopyout tail -2 .ocopy >X1 #cmp X1 Ref #log #next 7.1b 10 L7.1b A #print As I said, '.' is set to the last line touched by any command in the editor. So if you type 3p . will be set to line 3; and then .p will print the same line. Try that - with the usual trailer, the commands should be 3p .p w q ready The file is the same as before. #create Ref 3p .p w q #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #pipe #copyin ed file #user #uncopyin #unpipe tail -4 .copy >X1 #cmp X1 Ref #log #next 8.1a 10 8.2a 6 7.2c 2 iL7.2c 3 #print Now, print the fourth line in this file twice, using the same pattern. The file is the same, and you should put the usual finish (w, q, ready) after printing the line. #create Ref 4p .p w q #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #pipe #copyin ed file #user #uncopyin #unpipe tail -4 .copy >X1 #cmp X1 Ref #log #next 8.1a 10 8.2a 5 #L70.1a #print Perhaps the most powerful command in the editor is the 'g' (global) command. This always precedes a second command on the same command line; it selects those file lines on which the second command is to be executed. For example g/abc/s/def/ghi/p says: "Find all lines in the file which contain the string "abc"; change the first "def" on any such line into "ghi". The command after the 'g' may be any command, of course. Needless to say, the expressions after the 'g' may include all the special characters. Edit the file "towns" so that each line beginning with "-" has " (county seat)" added at its end. Rewrite the file and type "ready". #create Ref -newark (county seat) east orange south orange maplewood -elizabeth (county seat) linden cranford westfield -morristown (county seat) madison chatham dover #create towns -newark east orange south orange maplewood -elizabeth linden cranford westfield -morristown madison chatham dover #user #cmp towns Ref #log #next 71.1a 10 70.2e 9 70.2d 6 iL70.2a J #print Perhaps the most powerful editor command is the 'g' (global) command. This command selects sets of lines on which other commands are executed. For example, g/abc/p prints all lines on which 'abc' appears. In this directory is a file "story". Print all lines on which the word "of" appears. Then leave the editor and type "ready". #create Ref The people of the United States are in a sense becoming a nation of the United States in the future, it will be because that system did too good a job of filling many of the needs of the people. #create story The people of the United States are in a sense becoming a nation on a tiger. They must learn to consume more and more or, they are warned, their magnificent economic machine may turn and devour them. They must be induced to step up their individual consumption higher and higher, whether they have any pressing need for the goods or not. Their ever-expanding economy demands it. If modifications are forced upon the private-enterprise system of the United States in the future, it will be because that system did too good a job of filling many of the needs of the people. #copyout #user #uncopyout grep of .ocopy >x1 #cmp x1 Ref #log #next 70.2b 5 L70.2b K #print You can use any command with 'g', not just 'p'. For example g/xx/s/a/b/ changes 'a' to 'b' on every line containing 'xx'. As an example of the global command used with 'd', try this: In file "cities" there is a list of cities with their states and zip codes. Delete all cities which are in New Jersey (i.e. all lines containing NJ). Then rewrite the file and type "ready". #create Ref Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #create cities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #user #cmp cities Ref #log #next 70.2c 5 70.2d 10 dL70.2c M )#print In this directory is another copy of the "cities" file as you modified it, and the previous version named "ocities". Use "diff" to find out how many lines you deleted. Reply "answer N" where N is the number of lines you removed from "cities". #create cities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #create ocities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #copyin #user #uncopyin #match 6 #log #next 70.2d 10 NL70.2d N #print There is another file of cities with ZIP codes and states in this directory, but it was typed in wrong. Some cities in New Jersey are labeled as being in New York. However the ZIP codes are right. Since the cities in New Jersey are exactly those with zip codes beginning 07, if you can execute the substitute command to change NY to NJ on all lines with " 07" in them, all will be well. Don't forget the blank before the 07 - some ZIP codes have "07" in the middle, remember. Change file "cities" and rewrite it. Then type "ready". #create Ref Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #create cities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NY 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NY 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NY 07101 Paterson NY 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #user #cmp cities Ref #log #next 70.2e 5 7L70.2e P #print There is a file "cities" in this directory in which each line contains a city, state and ZIP code. But it was typed in by a member of management and is really botched - every NJ city is labeled as being in NY. But the Zip codes are right - if you can change NY to NJ on each line containing a ZIP code beginning with either 07 or 08 all will be fixed up. Each line looks like St. Louis MO 63166 and (1) remember the [] operators? and (2) don't forget that digits appear in the middle of ZIP codes. You may want to check what you're doing by writing the current version on a different file name and using "diff" to check on the changes. #create Ref Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #create cities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NY 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NY 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NY 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NY 07101 Paterson NY 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #user #cmp cities Ref #log #next 70.2f 5 L70.2f R +#print Remember the search for blank lines with nothing on them? /^$/. Pick up the file "table" and delete all blank lines; then rewrite it and type "ready". #create Ref Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #create table Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #user #cmp table Ref #log #next 70.2g 5 HL70.2g S #print Here is a file "values". Whenever the word "liter" appears in it, add at the end of that line the characters (1 liter = 1.06 quart) The parentheses should appear in the final file, and there should be one space before the left parenthesis. When done, rewrite the file and type "ready". #create Ref gasoline: .52/gallon milk: 35/qt rice: .30/lb acetic acid: 1.20/liter (1 liter = 1.06 quart) apples: .35/lb cider: .55/liter (1 liter = 1.06 quart) butter: .79/lb soda: .42/liter (1 liter = 1.06 quart) eggs: .89/doz cream: 1.25/liter (1 liter = 1.06 quart) #create values gasoline: .52/gallon milk: 35/qt rice: .30/lb acetic acid: 1.20/liter apples: .35/lb cider: .55/liter butter: .79/lb soda: .42/liter eggs: .89/doz cream: 1.25/liter #user #cmp values Ref #log #next 71.1a 5 L71.1a V 2#print After the global command has selected the lines to which the second command is to be applied, it sets '.' (the current line) to each of these lines in turn as it executes the controlled command. Thus you can reference the line before or after the selected line. For example, g/xx/.-1s/ab/cd/ changes 'ab' to 'cd' on the line BEFORE each line with xx. And g/xx/$t.+1 inserts a copy of the last line in the file two lines after each line with 'xx' on it. In this directory, the file 'memo' has paragraphs indicated by lines beginning ".PP". Add two blanks to the beginning of the line after each ".PP", and then delete the ".PP" lines. This should take only two commands. Rewrite the file and then type "ready". #create Ref The Ascent of the Riffelberg by Mark Twain I sat silent some time, then turned to Harris and said: ``My mind is made up.'' Something in my tone struck him; and when he glanced at my eye and read what was written there, his face paled perceptibly. He hesitated a moment, then said: ``Speak.'' I answered, with perfect calmness: ``I WILL ASCEND THE RIFFELBERG.'' If I had shot my poor friend he could not have fallen from his chair more suddenly. If I had been his father he could not have pleaded harder to get me to give up my purpose. But I turned a deaf ear to all he said. When he perceived at last that nothing could alter my determination, he ceased to urge, and for a while the deep silence was broken only by his sobs. I sat in marble resolution, with my eyes fixed upon vacancy, for in spirit I was already wrestling with the perils of the mountains, and my friend sat gazing at me in adoring admiration through his tears. At last he threw himself upon me in a loving embrace and exclaimed in broken tones: ``Your Harris will never desert you. We will die together!'' I cheered the noble fellow with praises, and soon his fears were forgotten and he was eager for the adventure. He wanted to summon the guides at once and leave at two in the morning, as he supposed the custom was; but I explained that nobody was looking at that hour; and that the start in the dark was not usually made from the village but from the first night's resting-place on the mountainside. I said we would leave the village at 3 or 4 p.m. on the morrow; meantime he could notify the guides, and also let the public know of the attempt which we proposed to make. I went to bed, but not to sleep. No man can sleep when he is about to undertake one of these Alpine exploits. I tossed feverishly all night long, and was glad enough when I heard the clock strike half past eleven and knew it was time to get up for dinner. #create memo The Ascent of the Riffelberg by Mark Twain .PP I sat silent some time, then turned to Harris and said: ``My mind is made up.'' Something in my tone struck him; and when he glanced at my eye and read what was written there, his face paled perceptibly. He hesitated a moment, then said: ``Speak.'' .PP I answered, with perfect calmness: ``I WILL ASCEND THE RIFFELBERG.'' .PP If I had shot my poor friend he could not have fallen from his chair more suddenly. If I had been his father he could not have pleaded harder to get me to give up my purpose. But I turned a deaf ear to all he said. When he perceived at last that nothing could alter my determination, he ceased to urge, and for a while the deep silence was broken only by his sobs. I sat in marble resolution, with my eyes fixed upon vacancy, for in spirit I was already wrestling with the perils of the mountains, and my friend sat gazing at me in adoring admiration through his tears. At last he threw himself upon me in a loving embrace and exclaimed in broken tones: ``Your Harris will never desert you. We will die together!'' .PP I cheered the noble fellow with praises, and soon his fears were forgotten and he was eager for the adventure. He wanted to summon the guides at once and leave at two in the morning, as he supposed the custom was; but I explained that nobody was looking at that hour; and that the start in the dark was not usually made from the village but from the first night's resting-place on the mountainside. I said we would leave the village at 3 or 4 p.m. on the morrow; meantime he could notify the guides, and also let the public know of the attempt which we proposed to make. .PP I went to bed, but not to sleep. No man can sleep when he is about to undertake one of these Alpine exploits. I tossed feverishly all night long, and was glad enough when I heard the clock strike half past eleven and knew it was time to get up for dinner. #user #cmp memo Ref #log #next 72.1a 10 72.2a 5 L72.1a W ,#print A command related to the global command is the 'v' command. It also selects lines on which a second command is executed; the difference between 'g' and 'v' is that the selected lines for the 'v' command are all those on which the expression is NOT found. Thus v/abc/s/x/y/g changes 'x' to 'y' on all lines NOT containing an 'abc'. There is a file 'price' in this directory. Find all lines that do NOT begin with blank and prefix three asterisks to them. Then rewrite the file and type "ready". #create Ref ***beef shoulder 1.39/lb flank 1.59/lb sirloin 2.19/lb round 1.89/lb ***fish sword 3.99/lb cod 1.99/lb blues 2.49/lb stripers 3.49/lb flounder 2.99/lb ***pork shoulder .89/lb loin 1.59/lb bacon 1.19/lb #create price beef shoulder 1.39/lb flank 1.59/lb sirloin 2.19/lb round 1.89/lb fish sword 3.99/lb cod 1.99/lb blues 2.49/lb stripers 3.49/lb flounder 2.99/lb pork shoulder .89/lb loin 1.59/lb bacon 1.19/lb #user #cmp price Ref #log #next 73.1a 10 L72.2a Y #print A command related to the 'g' command is the 'v' command. The 'v' command also selects lines on which another command is to be executed; the difference between 'g' and 'v' is that the 'v' command selects all lines on which the specified expression is NOT found. Thus v/ly$/p prints all lines which do NOT end in "ly". Or v/e/p prints all lines WITHOUT an 'e'in them. Are there any lines in file "story" without an 'i'? Find out using the editor; then leave the editor and type "yes" or "no". #create story Credit "rationing," already being imposed by major banks in big cities, may soon spread to banks large and small in every corner of the United States. Result: Speculative loans may become hard to get anywhere. Working in near-secrecy, a committee of the powerful American Bankers Association is drafting an unprecedented policy statement aimed at getting bankers across the country to be far choosier in making business loans. The ABA it is believed, is being driven to this move partly by a nagging fear that the Federal Government will impose lending guidelines if banks fail to tighten up voluntarily. The ABA's task is delicate. #copyin #user #uncopyin #match yes #log #next 72.2b 10 L72.2b Z #print Edit the file "cities" to remove all lines NOT containing "NJ". Then rewrite the file and type "ready". #create Ref Camden NJ 08101 Elizabeth NJ 07207 Jersey City NJ 07303 Newark NJ 07101 Paterson NJ 07510 Trenton NJ 08608 #create cities Albany NY 12201 Atlanta GA 30301 Baltimore MD 21233 Boston MA 02109 Bridgeport CN 06601 Buffalo NY 14240 Camden NJ 08101 Chicago IL 60607 Dallas TX 75221 Denver CO 80201 Detroit MI 48226 Elizabeth NJ 07207 Hartford CN 06101 Houston TX 77052 Indianapolis IN 46204 Jersey City NJ 07303 Los Angeles CA 90053 Miami FL 33101 Milwaukee WI 53201 Minneapolis MN 55401 New York NY 10001 Newark NJ 07101 Paterson NJ 07510 Philadelphia PA 19104 Phoenix AR 85026 Pittsburgh PA 15230 Providence RI 02904 Rochester NY 14603 San Diego CA 92101 San Francisco CA 94101 Seattle WA 98101 St. Louis MO 63166 Syracuse NY 13201 Trenton NJ 08608 Utica NY 13503 Washington DC 20013 Yonkers NY 10598 #user #cmp cities Ref #log #next 72.2c 10 L72.2c \ #print There is a file "price" in this directory. Find all lines which don't begin with blank and put three asterisks at the beginning of each such line. Then rewrite the file and type "ready". #create Ref ***beef shoulder 1.39/lb flank 1.59/lb sirloin 2.19/lb round 1.89/lb ***fish sword 3.99/lb cod 1.99/lb blues 2.49/lb stripers 3.49/lb flounder 2.99/lb ***pork shoulder .89/lb loin 1.59/lb bacon 1.19/lb #create price beef shoulder 1.39/lb flank 1.59/lb sirloin 2.19/lb round 1.89/lb fish sword 3.99/lb cod 1.99/lb blues 2.49/lb stripers 3.49/lb flounder 2.99/lb pork shoulder .89/lb loin 1.59/lb bacon 1.19/lb #user #cmp price Ref #log #next 72.2d 10 L72.2d ] #print There is a file "song" in this directory. Find all lines which don't end in "." and put a comma at the end of these lines. Then rewrite the file and type "ready". #create Ref It seems that Early English art, Alone retains its zest. To charm and please its devotees, We've done our level best. We're not quite sure that all we do, Has the Early English ring, But as far as we can tell, It's something lIke this sort of thing. #create song It seems that Early English art Alone retains its zest. To charm and please its devotees We've done our level best. We're not quite sure that all we do Has the Early English ring But as far as we can tell It's something lIke this sort of thing. #user #cmp song Ref #log #next 73.1a 10 iL73.1a #print Back early in this sequence we made clear that the shell (the normal command interpreter) and the editor were distinct and they didn't pay any attention to each other's commands. Sometimes you are in the editor and you really want to execute a shell command. You can do that by prefixing it with !. For example, !ls will list your directory. Remember that "date" is the shell command to find out what time it is. Try editing the file 'bridge'; print it out, then, without leaving the editor, ask for the time and then leave the editor and say "ready". #create bridge brooklyn manhattan williamsburg queensborough george washington triborough bronx whitestone throgs neck #create X2 !date #copyin #user #uncopyin grep date .copy | tail -1 >X1 #cmp X1 X2 #log #next 74.1a 10 L74.1a ` #print Here's a last review exercise. In the file "cities" is a list of cities with populations and Zip codes. The following cities were omitted: add them in alphabetical order St. Louis 622,236 MO 63166 Columbus 539,677 OH 43216 Then, edit the file so that (a) the blanks, if any, at the beginnings of lines and ends of lines are removed. (b) each interior string of blanks is replaced by a single tab, except for the blanks within "Los Angeles", "New Orleans", "New York", "San Antonio", "San Diego", "San Francisco", and "St. Louis". (c) Spell "Washington" and "Indianapolis" correctly. Then rewrite the file and type "ready". #create Ref Atlanta 496,973 GA 30301 Baltimore 905,759 MD 21233 Boston 641,071 MA 02109 Bridgeport 156,542 CN 06601 Buffalo 462,768 NY 14240 Chicago 3,366,957 IL 60607 Cleveland 750,903 OH 44101 Columbus 539,677 OH 43216 Dallas 844,401 TX 75221 Denver 514,678 CO 80201 Detroit 1,511,482 MI 48226 Hartford 158,017 CN 06101 Houston 1,232,802 TX 77052 Indianapolis 774,624 IN 46201 Los Angeles 2,809,596 CA 92101 Miami 334,859 FL 33101 Milwaukee 717,099 WI 53201 Minneapolis 434,400 MN 55401 New Orleans 593,471 LA 70140 New York 7,894,862 NY 10001 Newark 382,417 NJ 07901 Omaha 347,328 NE 68108 Philadephia 1,948,609 PA 19104 Phoenix 581,562 AR 85026 Pittsburgh 520,117 PA 15230 San Antonio 654,153 TX 78205 San Diego 696,769 CA 92101 San Francisco 715,674 CA 94101 Seattle 530,831 WA 98101 St. Louis 622,236 MO 63166 Washington 756,510 DC 20013 #create cities Atlanta 496,973 GA 30301 Baltimore 905,759 MD 21233 Boston 641,071 MA 02109 Bridgeport 156,542 CN 06601 Buffalo 462,768 NY 14240 Chicago 3,366,957 IL 60607 Cleveland 750,903 OH 44101 Dallas 844,401 TX 75221 Denver 514,678 CO 80201 Detroit 1,511,482 MI 48226 Hartford 158,017 CN 06101 Houston 1,232,802 TX 77052 Indianpolis 774,624 IN 46201 Los Angeles 2,809,596 CA 92101 Miami 334,859 FL 33101 Milwaukee 717,099 WI 53201 Minneapolis 434,400 MN 55401 New Orleans 593,471 LA 70140 New York 7,894,862 NY 10001 Newark 382,417 NJ 07901 Omaha 347,328 NE 68108 Philadephia 1,948,609 PA 19104 Phoenix 581,562 AR 85026 Pittsburgh 520,117 PA 15230 San Antonio 654,153 TX 78205 San Diego 696,769 CA 92101 San Francisco 715,674 CA 94101 Seattle 530,831 WA 98101 Washinggton 756,510 DC 20013 #user #cmp cities Ref #log iL8.1a _B #print To move around, you can use simple arithmetic when specifying what to print. For example, 3+1p is the same as 4p as an editor command. Now that's not very interesting; but if the '.' current line pointer is line 3, then using .+1p instead of 4p is helpful. For example, print the 3rd and 4th lines of the familiar file using first "3p" to get to line 3 and then ".+1p" to print the next line. End as usual with w, q, and ready. #create Ref thomas jefferson james madison 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #copyout #pipe ed file #user #unpipe #uncopyout tail -3 .ocopy >X1 #cmp Ref X1 #log #next 9.1a 10 8.1b 7 L8.1b y #print You can also use "-" in addresses. For example, the line before the current line is line ".-1" and can be printed with ".-1p" or even just ".-1". How would you print the line two lines before the current line? Type "answer COMMAND" where COMMAND is the command you would type to print that line. #copyin #user #uncopyin #match .-2p #match .-2 #match -2 #match -- #log #next 9.1a 10 9.2a 5 L8.2a 9 #print You can give addresses involving simple arithmetic to move around in the file. For example, 3+1p is the same as 4p in the editor. Now that's not interesting, but if the current line (".") is line 3, then .+1p is also 4p; it prints the next line. For example, you can print the 3rd and 4th lines of this file using 3p .+1p w q where "3p" prints the third line, as usual, and then ".+1p" prints the next or fourth line. Try that. Type "ready" when done. #create Ref caslon century schoolbook 86 #create file baskerville bodoni caslon century schoolbook futura helvetica news gothic times roman #copyout #pipe ed file #user #unpipe #uncopyout tail -3 .ocopy >X1 #cmp Ref X1 #log #next 8.2b 5 9.1a 10 L8.2b ; g#print Using the same scheme, print lines 2 and 3 of this file. Then rewrite it and leave and type "ready". #create Ref john adams thomas jefferson 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #copyout #pipe ed file #user #unpipe #uncopyout tail -3 .ocopy >X1 #cmp Ref X1 #log #next 8.2c 3 8.1b 8 L8.2c < #print You can also use "-" in addresses. For example, you can print the line before the current line with .-1p as a command. Again, I'll put you in the editor; print the fifth line and then the fourth, using this command to print lines in reverse order. Then leave with w, q, and ready. #create Ref carrots squash 83 #create file broccoli mushrooms cauliflower squash carrots lettuce string beans peas lima beans #copyout #pipe ed file #user #unpipe #uncopyout tail -3 .ocopy >X1 #cmp Ref X1 #log #next 9.1a 10 9.2a 5 cL9.1a > #print Printing only one line at a time gets pretty slow. You can print several lines with commands like 1,3p which prints lines 1, 2 and 3. Again, I'll put you into the editor with the familiar file. Print lines 2 through 5 of it; then type w, q and ready. #create Ref john adams thomas jefferson james madison james monroe 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #copyout #pipe ed file #user #unpipe #uncopyout tail -5 .ocopy >X1 #cmp X1 Ref #log #next 10.1a 10 9.2e 5 L9.2a @ #print You can print several lines at once by using commands like 1,3p which prints lines 1, 2 and 3. Again, I'll put you into the editor. Print lines 1 to 3 of the file; then type w, q and ready. Your commands should look like 1,3p w q ready #create Ref george washington john adams thomas jefferson 91 #create file george washington john adams thomas jefferson james madison james monroe john quincy adams #copyout #pipe ed file #user #unpipe #uncopyout tail -4 .ocopy >X1 #cmp X1 Ref #log #next 9.2b 5 L9.2b B #print You can of course use any kind of line numbers for the addresses in the "p" command. Just as you did before, print lines 2 through 5 of this file, and then type w, q, and ready. #create Ref mushrooms cauliflower squash carrots 83 #create file broccoli mushrooms cauliflower squash carrots lettuce string beans peas lima beans #copyout #pipe ed file #user #unpipe #uncopyout tail -5 .ocopy >X1 #cmp X1 Ref #log #next 9.3c 3 9.2d 7 L9.2d D #print The "." operator can be used with multiple addresses to refer to the current line in either the first or second position (or both). For example, you could print from the current line to the 6th line with .,6p and similarly for any other line. I'll put you in the editor again, with the current line set in the middle of a short file; print from the current line position to the fifth line, and then type w, q and ready. #create Ref 2. UNIX 3. hardware 4. software 5. manuals 97 #create file 2. UNIX 3. hardware 4. software 5. manuals you shouldn't have printed this line. #copyout #pipe ed file 1t1 #user #unpipe #uncopyout tail -5 .ocopy >X1 #cmp X1 Ref #log #next 9.2e 5 lL9.2e y #print You can also employ addresses using arithmetic with this kind of command. For example, what "p" command would you type to print from line 2 to the line before the current line of the file? Remember what the line before the current line is: .-1 right? Type "answer COMMAND" where COMMAND is the specified "p" command. #copyin #user #uncopyin #match 2,.-1p #match 2,-p #match 2,.-p #log #next 10.1a 10 10.2a 5 10.3a 2 L9.3c I 8#print You can make up addresses for the 'p' command using '.' for the current line when there are two addresses, also. For example, you could print from the first line up to the present line with 1,.p and I suggest you try that now. After that command, type the usual w q ready #create Ref 83 broccoli mushrooms cauliflower squash carrots lettuce string beans peas lima beans 83 #create file broccoli mushrooms cauliflower squash carrots lettuce string beans peas lima beans #copyout #pipe ed file #user #unpipe #uncopyout #cmp .ocopy Ref #log #next 9.2d 5