|
|
1.1 root 1: .\" @(#)ae7 6.1 (Berkeley) 6/5/86
2: .\"
3: .NH
4: SUPPORTING TOOLS
5: .PP
6: There are several tools and techniques that go along with the
7: editor, all of which are relatively easy once you
8: know how
9: .UL ed
10: works,
11: because they are all based on the editor.
12: In this section we will give some fairly cursory examples
13: of these tools,
14: more to indicate their existence than to provide
15: a complete tutorial.
16: More information on each can be found in
17: [3].
18: .SH
19: Grep
20: .PP
21: Sometimes you want to find all occurrences of some word or pattern in
22: a set of files, to edit them
23: or perhaps just to verify their presence or absence.
24: It may be possible to edit each file separately and look
25: for the pattern of interest, but if there are many files
26: this can get very tedious,
27: and if the files are really big,
28: it may be impossible because of limits in
29: .UL ed .
30: .PP
31: The program
32: .UL grep
33: was invented to get around these limitations.
34: The search patterns that we have described in the paper are often
35: called `regular expressions', and
36: `grep' stands for
37: .P1
38: g/re/p
39: .P2
40: That describes exactly what
41: .UL grep
42: does _
43: it prints every line in a set of files that contains a
44: particular pattern.
45: Thus
46: .P1
47: grep \(fmthing\(fm file1 file2 file3 ...
48: .P2
49: finds `thing' wherever it occurs in any of the files
50: `file1',
51: `file2',
52: etc.
53: .UL grep
54: also indicates the file in which the line was found,
55: so you can later edit it if you like.
56: .PP
57: The pattern represented by `thing' can be any
58: pattern you can use in the editor,
59: since
60: .UL grep
61: and
62: .UL ed
63: use exactly the same mechanism for
64: pattern searching.
65: It is wisest always to enclose the pattern in the
66: single quotes \(fm...\(fm if it contains any non-alphabetic
67: characters, since many such characters also mean something
68: special to the
69: .UX
70: command interpreter
71: (the `shell').
72: If you don't quote them, the command interpreter will
73: try to interpret them before
74: .UL grep
75: gets a chance.
76: .PP
77: There is also a way to find lines that
78: .ul
79: don't
80: contain a pattern:
81: .P1
82: grep -v \(fmthing\(fm file1 file2 ...
83: .P2
84: finds all lines that
85: don't contains `thing'.
86: The
87: .UL \-v
88: must occur in the position shown.
89: Given
90: .UL grep
91: and
92: .UL grep\ \-v ,
93: it is possible to do things like selecting all lines that
94: contain some combination of patterns.
95: For example, to get all lines that contain `x' but not `y':
96: .P1
97: grep x file... | grep -v y
98: .P2
99: (The notation | is a `pipe',
100: which causes the output of the first command to be used as
101: input to the second command; see [2].)
102: .SH
103: Editing Scripts
104: .PP
105: If a fairly complicated set of editing operations
106: is to be done on a whole set of files,
107: the easiest thing to do is to make up a `script',
108: i.e., a file that contains the operations you want to perform,
109: then apply this script to each file in turn.
110: .PP
111: For example, suppose you want to change every
112: `Unix' to `UNIX' and every `Gcos' to `GCOS' in a large number of files.
113: Then put into the file `script' the lines
114: .P1
115: g/Unix/s//UNIX/g
116: g/Gcos/s//GCOS/g
117: w
118: q
119: .P2
120: Now you can say
121: .P1
122: ed file1 <script
123: ed file2 <script
124: \&...
125: .P2
126: This causes
127: .UL ed
128: to take its commands from the prepared script.
129: Notice that the whole job has to be planned in advance.
130: .PP
131: And of course by using the
132: .UX
133: command interpreter, you can
134: cycle through a set of files
135: automatically, with varying degrees of ease.
136: .SH
137: Sed
138: .PP
139: .UL sed
140: (`stream editor')
141: is a version of the editor with restricted capabilities
142: but which is capable of processing unlimited amounts of input.
143: Basically
144: .UL sed
145: copies its input to its output, applying one or more
146: editing commands to each line of input.
147: .PP
148: As an example, suppose that we want to do the `Unix' to `UNIX'
149: part of the
150: example given above,
151: but without rewriting the files.
152: Then the command
153: .P1
154: sed \(fms/Unix/UNIX/g\(fm file1 file2 ...
155: .P2
156: applies the command
157: `s/Unix/UNIX/g'
158: to all lines from `file1', `file2', etc.,
159: and copies all lines to the output.
160: The advantage of using
161: .UL sed
162: in such a case is that it can be used
163: with input too large for
164: .UL ed
165: to handle.
166: All the output can be collected in one place,
167: either in a file or perhaps piped into another program.
168: .PP
169: If the editing transformation is so complicated
170: that
171: more than one editing command is needed,
172: commands can be supplied from a file,
173: or on the command line,
174: with a slightly more complex syntax.
175: To take commands from a file, for example,
176: .P1
177: sed -f cmdfile input-files...
178: .P2
179: .PP
180: .UL sed
181: has further capabilities, including conditional testing
182: and branching, which we cannot go into here, but which are
183: described in detail in
184: .ul
185: Sed \- A Non-interactive Text Editor.
186:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.