|
|
1.1 ! root 1: .\" @(#)e4 6.1 (Berkeley) 5/22/86 ! 2: .\" ! 3: .SH ! 4: Exercise 5: ! 5: .PP ! 6: Experiment with the substitute command. ! 7: See what happens if you ! 8: substitute for some word on a line with several occurrences of that word. ! 9: For example, do this: ! 10: .P1 ! 11: a ! 12: the other side of the coin ! 13: \*. ! 14: s/the/on the/p ! 15: .P2 ! 16: You will get ! 17: .P1 ! 18: on the other side of the coin ! 19: .P2 ! 20: A substitute command changes only the first occurrence of the first string. ! 21: You can change all occurrences by adding a ! 22: .UL g ! 23: (for ``global'') ! 24: to the ! 25: .UL s ! 26: command, like this: ! 27: .P1 ! 28: s/ . . . / . . . /gp ! 29: .P2 ! 30: Try other characters instead of slashes to delimit the two sets ! 31: of characters in the ! 32: .UL s ! 33: command \- anything should work ! 34: except blanks or tabs. ! 35: .PP ! 36: (If you get funny results using any of the characters ! 37: .P1 ! 38: ^ \*. $ [ * \e & ! 39: .P2 ! 40: read the section on ``Special Characters''.) ! 41: .SH ! 42: Context searching \- ``/ . . . /'' ! 43: .PP ! 44: With the substitute command mastered, you can move on to ! 45: another highly important idea of ! 46: .ul ! 47: ed ! 48: \- context searching. ! 49: .PP ! 50: Suppose you have the original three line text in the buffer: ! 51: .P1 ! 52: Now is the time ! 53: for all good men ! 54: to come to the aid of their party. ! 55: .P2 ! 56: Suppose you want to find the line that contains ! 57: .IT their ! 58: so ! 59: you can change it to ! 60: .IT the . ! 61: Now with only three lines in the buffer, it's pretty easy ! 62: to keep track of what line the word ! 63: .IT their ! 64: is on. ! 65: But if the buffer contained several hundred lines, ! 66: and you'd been making changes, deleting and rearranging lines, ! 67: and so on, you would no longer really know what this line ! 68: number would be. ! 69: Context searching is simply a method of specifying the desired line, ! 70: regardless of what its number is, ! 71: by specifying some context on it. ! 72: .PP ! 73: The way to say ``search for a line ! 74: that contains this particular string of characters'' ! 75: is to type ! 76: .P1 ! 77: /\fIstring of characters we want to find\fP/ ! 78: .P2 ! 79: For example, ! 80: the ! 81: .ul ! 82: ed ! 83: command ! 84: .P1 ! 85: /their/ ! 86: .P2 ! 87: is a context search which ! 88: is sufficient to find the desired line \- ! 89: it will locate the next occurrence of ! 90: the characters between slashes (``their''). ! 91: It also sets dot to that line ! 92: and prints the line for verification: ! 93: .P1 ! 94: to come to the aid of their party. ! 95: .P2 ! 96: ``Next occurrence'' means that ! 97: .ul ! 98: ed ! 99: starts looking for the string at line ! 100: .UL .+1 , ! 101: searches to the end of the buffer, ! 102: then continues at line 1 and searches to line dot. ! 103: (That is, the search ``wraps around'' from ! 104: .UL $ ! 105: to ! 106: 1.) ! 107: It scans all the lines in the buffer until it either finds the desired line ! 108: or gets back to dot again. ! 109: If the given string of characters can't be found in any line, ! 110: .ul ! 111: ed ! 112: types the error message ! 113: .P1 ! 114: ? ! 115: .P2 ! 116: Otherwise it prints the line it found. ! 117: .PP ! 118: You can do both the search for the desired line ! 119: .ul ! 120: and ! 121: a ! 122: substitution all at once, like this: ! 123: .P1 ! 124: /their/s/their/the/p ! 125: .P2 ! 126: which will yield ! 127: .P1 ! 128: to come to the aid of the party. ! 129: .P2 ! 130: There were three parts to that last command: ! 131: context search for the desired line, make the substitution, print the line. ! 132: .PP ! 133: The expression ! 134: .UL /their/ ! 135: is a context search expression. ! 136: In their simplest form, ! 137: all context search expressions are like this \- ! 138: a string of characters surrounded by slashes. ! 139: Context searches are interchangeable with line numbers, ! 140: so they can be used by themselves to find and print a desired line, ! 141: or as line numbers for some other command, like ! 142: .UL s . ! 143: They were used both ways in the examples above. ! 144: .PP ! 145: Suppose the buffer contains the three familiar lines ! 146: .P1 ! 147: Now is the time ! 148: for all good men ! 149: to come to the aid of their party. ! 150: .P2 ! 151: Then the ! 152: .ul ! 153: ed ! 154: line numbers ! 155: .P1 ! 156: /Now/+1 ! 157: /good/ ! 158: /party/\-1 ! 159: .P2 ! 160: are all context search expressions, and they all refer ! 161: to the same line (line 2). ! 162: To make a change in line 2, ! 163: you could say ! 164: .P1 ! 165: /Now/+1s/good/bad/ ! 166: .P2 ! 167: or ! 168: .P1 ! 169: /good/s/good/bad/ ! 170: .P2 ! 171: or ! 172: .P1 ! 173: /party/\-1s/good/bad/ ! 174: .P2 ! 175: The choice is dictated only by convenience. ! 176: You could print all three lines by, for instance ! 177: .P1 ! 178: /Now/,/party/p ! 179: .P2 ! 180: or ! 181: .P1 ! 182: /Now/,/Now/+2p ! 183: .P2 ! 184: or by any number of similar combinations. ! 185: The first one of these might be better if you don't ! 186: know how many lines are involved. ! 187: (Of course, if there were only three lines in the buffer, ! 188: you'd use ! 189: .P1 ! 190: 1,$p ! 191: .P2 ! 192: but not if there were several hundred.) ! 193: .PP ! 194: The basic rule is: a context search expression is ! 195: .ul ! 196: the same as ! 197: a line number, so it can be used wherever a line number is needed. ! 198: .SH ! 199: Exercise 6: ! 200: .PP ! 201: Experiment with context searching. ! 202: Try a body of text with ! 203: several occurrences ! 204: of the same string of characters, and scan through it using ! 205: the same context search. ! 206: .PP ! 207: Try using context searches as line numbers for the ! 208: substitute, print and delete commands. ! 209: (They can also be used ! 210: with ! 211: .UL r , ! 212: .UL w , ! 213: and ! 214: .UL a .) ! 215: .PP ! 216: Try context searching using ! 217: .UL ?text? ! 218: instead of ! 219: .UL /text/ . ! 220: This scans lines in the buffer in reverse order ! 221: rather than normal. ! 222: This is ! 223: sometimes useful if you go too far while looking for some ! 224: string of characters \- it's an easy way to back up. ! 225: .PP ! 226: (If you get funny results with any of the characters ! 227: .P1 ! 228: ^ \*. $ [ * \e & ! 229: .P2 ! 230: read the section on ``Special Characters''.) ! 231: .PP ! 232: .ul ! 233: Ed ! 234: provides a shorthand for repeating a context search ! 235: for the same string. ! 236: For example, ! 237: the ! 238: .ul ! 239: ed ! 240: line number ! 241: .P1 ! 242: /string/ ! 243: .P2 ! 244: will find the next occurrence of ! 245: .UL string . ! 246: It often happens that this is not the desired line, ! 247: so the search must be repeated. ! 248: This can be done by typing merely ! 249: .P1 ! 250: // ! 251: .P2 ! 252: This shorthand stands for ``the most recently used ! 253: context search expression.'' ! 254: It can ! 255: also be used as the first string of the substitute ! 256: command, as in ! 257: .P1 ! 258: /string1/s//string2/ ! 259: .P2 ! 260: which will find the next occurrence of ! 261: .UL string1 ! 262: and replace it by ! 263: .UL string2 . ! 264: This can save a lot of typing. ! 265: Similarly ! 266: .P1 ! 267: ?? ! 268: .P2 ! 269: means ``scan backwards for the same expression.''
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.