Commit | Line | Data |
---|---|---|
95f51977 | 1 | .\" @(#)e4 6.1 (Berkeley) 5/22/86 |
53eae729 KD |
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.'' |