|
|
1.1 root 1: .\" Copyright (c) 1990 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)ed.1 6.5.1.1 (Berkeley) 10/21/90
6: .\"
7: .Dd October 21, 1990
8: .Dt ED 1
9: .Os ATT 7th
10: .if t .ds q \(aa
11: .if n .ds q '
12: .Sh NAME
13: .Nm ed
14: .Nd text editor
15: .Sh SYNOPSIS
16: .Nm ed
17: .Op Fl
18: .Op Ar file
19: .Sh DESCRIPTION
20: .Nm Ed
21: is the standard text editor.
22: .Pp
23: If a
24: .Ar file
25: argument is given,
26: .Nm ed
27: simulates an
28: .Ic e
29: command (see below) on the named file; that is to say,
30: the file is read into
31: .Nm ed 's
32: buffer so that it can be edited.
33: .Tw Ds
34: .Tp Fl
35: Suppresses the printing
36: of explanatory output
37: and should be used
38: when the standard input is
39: an editor script.
40: .Tp
41: .Pp
42: .Nm Ed
43: operates on a copy of any file it is editing; changes made
44: in the copy have no effect on the file until a
45: .Ic w
46: (write) command is given.
47: The copy of the text being edited resides
48: in a temporary file called the
49: .Ar buffer .
50: .Pp
51: Commands to
52: .Nm ed
53: have a simple and regular structure: zero or
54: more
55: .Ar addresses
56: followed by a single character
57: .Ar command ,
58: possibly
59: followed by parameters to the command.
60: These addresses specify one or more lines in the buffer.
61: Missing addresses are supplied by default.
62: .Pp
63: In general, only one command may appear on a line.
64: Certain commands allow the
65: addition of text to the buffer.
66: While
67: .Nm ed
68: is accepting text, it is said
69: to be in
70: .Ar input mode .
71: In this mode, no commands are recognized;
72: all input is merely collected.
73: Input mode is left by typing a period
74: .Sq Ic \&.
75: alone at the
76: beginning of a line.
77: .Pp
78: .Nm Ed
79: supports a limited form of
80: .Ar regular expression
81: notation.
82: A regular expression specifies
83: a set of strings of characters.
84: A member of this set of strings is said to be
85: .Ar matched
86: by the regular expression.
87: In the following specification for regular expressions
88: the word `character' means any character but newline.
89: .Tw Ds
90: .Tp 1.
91: Any character except a special character
92: matches itself.
93: Special characters are
94: the regular expression delimiter plus
95: .Sq Cm \e\[.
96: and sometimes
97: .Sq Cm ^*$ .
98: .Tp 2.
99: A
100: .Sq Cm \&.
101: matches any character.
102: .Tp 3.
103: A
104: .Sq Li \e
105: followed by any character except a digit or
106: .Li (\)
107: matches that character.
108: .Tp 4.
109: A nonempty string
110: .Op Ar s
111: or
112: .Oo
113: .Cx \&(
114: .Op Cm \&^ Ar s
115: .Cx \&)
116: .Cx
117: .Oo
118: matches any character in (or not in)
119: .Ar s .
120: In
121: .Ar s ,
122: .Sq Li \e
123: has no special meaning, and
124: may only appear as
125: the first letter.
126: A substring
127: .Ar a\-b ,
128: with
129: .Ar a
130: and
131: .Ar b
132: in ascending ASCII order, stands for the inclusive
133: range of ASCII characters.
134: .Tp 5.
135: A regular expression of form 1\-4 followed by * matches a sequence of
136: 0 or more matches of the regular expression.
137: .Tp 6.
138: A regular expression,
139: .Ar x ,
140: of form 1\-8, bracketed
141: .Cx Li \e(
142: .Ar x
143: .Li \e)
144: .Cx
145: matches what
146: .Ar x
147: matches.
148: .Tp 7.
149: A \e followed by a digit
150: .Ar n
151: matches a copy of the string that the
152: bracketed regular expression beginning with the
153: .Cx Ar n
154: .Cx \'th
155: .Cx
156: .Li \e(
157: matched.
158: .Tp 8.
159: A regular expression of form 1\-8,
160: .Ar x ,
161: followed by a regular expression of form 1\-7,
162: .Ar y
163: matches a match for
164: .Ar x
165: followed by a match for
166: .Ar y ,
167: with the
168: .Ar x
169: match being as long as possible while still permitting a
170: .Ar y
171: match.
172: .Tp 9.
173: A regular expression of form 1\-8 preceded by
174: .Sq Li ^
175: (or followed by
176: .Sq Li $ ) ,
177: is constrained to matches that
178: begin at the left (or end at the right) end of a line.
179: .Tp 10.
180: A regular expression of form 1\-9 picks out the
181: longest among the leftmost matches in a line.
182: .Tp 11.
183: An empty regular expression stands for a copy of the
184: last regular expression encountered.
185: .Tp
186: .Pp
187: Regular expressions are used in addresses to specify
188: lines and in one command
189: (see
190: .Ar s
191: below)
192: to specify a portion of a line which is to be replaced.
193: If it is desired to use one of
194: the regular expression metacharacters as an ordinary
195: character, that character may be preceded by
196: .Sq Li \e .
197: This also applies to the character bounding the regular
198: expression (often
199: .Sq Li \&/ )
200: and to
201: .Sq Li \e
202: itself.
203: .Pp
204: To understand addressing in
205: .Nm ed
206: it is necessary to know that at any time there is a
207: .Ar current line.
208: Generally speaking, the current line is
209: the last line affected by a command; however,
210: the exact effect on the current line
211: is discussed under the description of
212: the command.
213: Addresses are constructed as follows.
214: .Tw Ds
215: .Tp 1.
216: The character
217: .Sq Ic \&.
218: addresses the current line.
219: .Tp 2.
220: The character
221: .Cx `
222: .Ic $
223: .Cx \'
224: .Cx
225: addresses the last line of the buffer.
226: .Tp 3.
227: A decimal number
228: .Ar n
229: addresses the
230: .Cx Ar n
231: .Cx \'th
232: .Cx
233: line of the buffer.
234: .Tp 4.
235: .Cx `\(fm
236: .Ar x
237: .Cx \'
238: .Cx
239: addresses the line marked with the name
240: .Ar x ,
241: which must be a lower-case letter.
242: Lines are marked with the
243: .Ar k
244: command described below.
245: .Tp 5.
246: A regular expression enclosed in slashes
247: .Cx `
248: .Li /
249: .Cx \'
250: .Cx
251: addresses
252: the line found by searching forward from the current line
253: and stopping at the first line containing a
254: string that matches the regular expression.
255: If necessary the search wraps around to the beginning of the
256: buffer.
257: .Tp 6.
258: A regular expression enclosed in queries
259: .Cx `
260: .Li ?
261: .Cx \'
262: .Cx
263: addresses
264: the line found by searching backward from the current line
265: and stopping at the first line containing
266: a string that matches the regular expression.
267: If necessary
268: the search wraps around to the end of the buffer.
269: .Tp 7.
270: An address followed by a plus sign
271: .Cx `
272: .Li +
273: .Cx \'
274: .Cx
275: or a minus sign
276: .Cx `
277: .Li \-
278: .Cx \'
279: .Cx
280: followed by a decimal number specifies that address plus
281: (resp. minus) the indicated number of lines.
282: The plus sign may be omitted.
283: .Tp 8.
284: If an address begins with
285: .Cx `
286: .Li +
287: .Cx \'
288: .Cx
289: or
290: .Cx `
291: .Li \-
292: .Cx \'
293: .Cx
294: the addition or subtraction is taken with respect to the current line;
295: e.g.
296: .Cx `
297: .Li \-5
298: .Cx \'
299: .Cx
300: is understood to mean
301: .Cx `
302: .Li .\-5
303: .Cx \'
304: .Cx
305: .Nm .
306: .Tp 9.
307: If an address ends with
308: .Cx `
309: .Li +
310: .Cx \'
311: .Cx
312: .Cx `
313: .Li \-
314: .Cx \',
315: .Cx
316: then 1 is added (resp. subtracted).
317: As a consequence of this rule and rule 8,
318: the address
319: .Cx `
320: .Li \-
321: .Cx \'
322: .Cx
323: refers to the line before the current line.
324: Moreover,
325: trailing
326: .Cx `
327: .Li +
328: .Cx \'
329: .Cx
330: and
331: .Cx `
332: .Li \-
333: .Cx \'
334: .Cx
335: characters
336: have cumulative effect, so
337: .Cx `
338: .Li \-\-
339: .Cx \'
340: .Cx
341: refers to the current
342: line less 2.
343: .Tp 10.
344: To maintain compatibility with earlier versions of the editor,
345: the character
346: .Cx `
347: .Li ^
348: .Cx \'
349: .Cx
350: in addresses is
351: equivalent to
352: .Cx `
353: .Li \-
354: .Cx \'.
355: .Cx
356: .Tp
357: .Pp
358: Commands may require zero, one, or two addresses.
359: Commands which require no addresses regard the presence
360: of an address as an error.
361: Commands which accept one or two addresses
362: assume default addresses when insufficient are given.
363: If more addresses are given than such a command requires,
364: the last one or two (depending on what is accepted) are used.
365: .Pp
366: Addresses are separated from each other typically by a comma
367: .Cx `
368: .Li ,
369: .Cx \'
370: .Cx
371: They may also be separated by a semicolon
372: .Cx `
373: .Li ;
374: .Cx \'
375: .Cx
376: In this case the current line
377: .Cx `
378: .Li .
379: .Cx \'
380: .Cx
381: .Nm .
382: is set to
383: the previous address before the next address is interpreted.
384: This feature can be used to determine the starting
385: line for forward and backward searches
386: .Cx \&(`
387: .Li /
388: .Cx \'
389: .Cx
390: .Cx `
391: .Li ?
392: .Cx \').
393: .Cx
394: The second address of any two-address sequence
395: must correspond to a line following the line corresponding to the first address.
396: The special form
397: .Cx `
398: .Li \&%
399: .Cx \'
400: .Cx
401: is an abbreviation for the address pair
402: .Cx `
403: .Li 1,$
404: .Cx \'.
405: .Cx
406: .Pp
407: In the following list of
408: .Nm ed
409: commands, the default addresses
410: are shown in parentheses.
411: The parentheses are not part of
412: the address, but are used to show that the given addresses are
413: the default.
414: .Pp
415: As mentioned, it is generally illegal for more than one
416: command to appear on a line.
417: However, most commands may be suffixed by `p'
418: or by `l', in which case
419: the current line is either
420: printed or listed respectively
421: in the way discussed below.
422: Commands may also be suffixed by `n',
423: meaning the output of the command is to
424: be line numbered.
425: These suffixes may be combined in any order.
426: .Tw Ds
427: .Tp Cx \&(
428: .Ic .
429: .Cx \&)
430: .Ic a
431: .Cx
432: .Tp <text>
433: .Tp Ic \&.
434: The append command reads the given text
435: and appends it after the addressed line.
436: .Sq Ic \&.
437: is left
438: on the last line input, if there
439: were any, otherwise at the addressed line.
440: Address `0' is legal for this command; text is placed
441: at the beginning of the buffer.
442: .Tp Cx \&(
443: .Ic \&.
444: .Cx \&,
445: .Ic \&.
446: .Cx \&)
447: .Ic \&c
448: .Cx
449: .Tp <text>
450: .Tp Ic \&.
451: The change
452: command deletes the addressed lines, then accepts input
453: text which replaces these lines.
454: .Sq Ic \&.
455: is left at the last line input; if there were none,
456: it is left at the line preceding the deleted lines.
457: .Tp Cx \&(
458: .Ic \&.
459: .Cx \&,
460: .Ic \&.
461: .Cx \&)
462: .Ic \&d
463: .Cx
464: The delete command deletes the addressed lines from the buffer.
465: The line originally after the last line deleted becomes the current line;
466: if the lines deleted were originally at the end,
467: the new last line becomes the current line.
468: .Tp Cx Ic \&e
469: .Cx \&\ \&
470: .Ar filename
471: .Cx
472: The edit
473: command causes the entire contents of the buffer to be deleted,
474: and then the named file to be read in.
475: .Sq Ic \&.
476: is set to the last line of the buffer.
477: The number of characters read is typed.
478: .Ar filename
479: is remembered for possible use as a default file name
480: in a subsequent
481: .Ic r
482: or
483: .Ic w
484: command.
485: If
486: .Ar filename
487: is missing, the remembered name is used.
488: .Tp Cx Ic E
489: .Cx \&\ \&
490: .Ar filename
491: .Cx
492: This command is the same as
493: .Ic e ,
494: except that no diagnostic results when no
495: .Ic w
496: has been given since the last buffer alteration.
497: .Tp Cx Ic f
498: .Cx \&\ \&
499: .Ar filename
500: .Cx
501: The filename command prints the currently remembered file name.
502: If
503: .Ar filename
504: is given,
505: the currently remembered file name is changed to
506: .Ar filename .
507: .Tp Cx \&(
508: .Ic \&1
509: .Cx \&,
510: .Ic \&$
511: .Cx \&)
512: .Ic \&g
513: .Ar/regular expression/command list
514: .Cx
515: In the global
516: command, the first step is to mark every line which matches
517: the given regular expression.
518: Then for every such line, the
519: given command list is executed with
520: .Cx `
521: .Ic \&.
522: .Cx \'
523: .Cx
524: initially set to that line.
525: A single command or the first of multiple commands
526: appears on the same line with the global command.
527: All lines of a multi-line list except the last line must be ended with
528: .Cx `
529: .Ic \&\e
530: .Cx \'.
531: .Cx
532: .Ic A ,
533: .Ic i,
534: and
535: .Ic c
536: commands and associated input are permitted;
537: the
538: .Cx `
539: .Ic \&.
540: .Cx \'
541: .Cx
542: terminating input mode may be omitted if it would be on the
543: last line of the command list.
544: The commands
545: .Ic g
546: and
547: .Ic v
548: are not permitted in the command list.
549: .Tp Cx \&(
550: .Ic .
551: .Cx \&)
552: .Ic i
553: .Cx
554: .Tp <text>
555: .Tp Ic \&.
556: This command inserts the given text before the addressed line.
557: .Cx `
558: .Ic \&.
559: .Cx \'
560: .Cx
561: is left at the last line input, or, if there were none,
562: at the line before the addressed line.
563: This command differs from the
564: .Ic a
565: command only in the placement of the
566: text.
567: .Tp Cx \&(
568: .Ic \&.
569: .Cx \&,
570: .Ic \&.+1
571: .Cx \&)
572: .Ic \&j
573: .Cx
574: This command joins the addressed lines into a single line;
575: intermediate newlines simply disappear.
576: .Cx `
577: .Ic \&.
578: .Cx \'
579: .Cx
580: is left at the resulting line.
581: .Tp Cx \&(
582: .Ic .
583: .Cx \&)
584: .Ic k
585: .Ar x
586: .Cx
587: The mark command marks the addressed line with
588: name
589: .Ar x ,
590: which must be a lower-case letter.
591: The address form
592: .Cx `\(fm
593: .Ar x
594: .Cx \'
595: .Cx
596: then addresses this line.
597: .Tp Cx \&(
598: .Ic \&.
599: .Cx \&,
600: .Ic \&.
601: .Cx \&)
602: .Ic \&l
603: .Cx
604: The list command
605: prints the addressed lines in an unambiguous way:
606: non-graphic characters are
607: printed in two-digit octal,
608: and long lines are folded.
609: The
610: .Ar l
611: command may be placed on the same line after any non-i/o
612: command.
613: .Tp Cx \&(
614: .Ic \&.
615: .Cx \&,
616: .Ic \&.
617: .Cx \&)
618: .Ic \&m
619: .Ar a
620: .Cx
621: The move command repositions the addressed lines after the line
622: addressed by
623: .Ar a .
624: The last of the moved lines becomes the current line.
625: .Tp Cx \&(
626: .Ic \&.
627: .Cx \&,
628: .Ic \&.
629: .Cx \&)
630: .Ic \&p
631: .Cx
632: The print command prints the addressed lines.
633: .Cx `
634: .Ic \&.
635: .Cx \'
636: .Cx
637: is left at the last line printed.
638: The
639: .Ic p
640: command
641: may
642: be placed on the same line after any non-i/o command.
643: .Tp Cx \&(
644: .Ic \&.
645: .Cx \&,
646: .Ic \&.
647: .Cx \&)
648: .Ic \&P
649: .Cx
650: This command is a synonym for
651: .Ic p .
652: .Tp Ic q
653: The quit command causes
654: .Nm ed
655: to exit.
656: No automatic write
657: of a file is done.
658: .Tp Ic Q
659: This command is the same as
660: .Ic q ,
661: except that no diagnostic results when no
662: .Ic w
663: has been given since the last buffer alteration.
664: .Tp Cx \&(
665: .Ic $
666: .Cx \&)
667: .Ic r
668: .Cx \&\ \&
669: .Ar filename
670: .Cx
671: The read command
672: reads in the given file after the addressed line.
673: If no file name is given,
674: the remembered file name, if any, is used
675: (see
676: .Ic e
677: and
678: .Ic f
679: commands).
680: The file name is remembered if there was no
681: remembered file name already.
682: Address `0' is legal for
683: .Ic r
684: and causes the
685: file to be read at the beginning of the buffer.
686: If the read is successful, the number of characters
687: read is typed.
688: .Cx `
689: .Ic \&.
690: .Cx \'
691: .Cx
692: is left at the last line read in from the file.
693: .Tp Cx \&(
694: .Ic \&.
695: .Cx \&,
696: .Ic \&.
697: .Cx \&)
698: .Ic \&s
699: .Ar/regular expression/replacement/
700: .Cx \&\tor
701: .Cx
702: .Tp Cx \&(
703: .Ic \&.
704: .Cx \&,
705: .Ic \&.
706: .Cx \&)
707: .Ic \&s
708: .Ar/regular expression/replacement/
709: .Ic \&g
710: .Cx
711: The substitute command searches each addressed
712: line for an occurrence of the specified regular expression.
713: On each line in which a match is found,
714: all matched strings are replaced by the replacement specified,
715: if the global replacement indicator
716: .Ic \&g
717: appears after the command.
718: If the global indicator does not appear, only the first occurrence
719: of the matched string is replaced.
720: It is an error for the substitution to fail on all addressed lines.
721: Any punctuation character
722: may be used instead of
723: .Cx `
724: .Ic \&/
725: .Cx \'
726: .Cx
727: to delimit the regular expression
728: and the replacement.
729: .Cx `
730: .Ic \&.
731: .Cx \'
732: .Cx
733: is left at the last line substituted.
734: An ampersand
735: .Cx `
736: .Ic \&&
737: .Cx \'
738: .Cx
739: appearing in the replacement
740: is replaced by the string matching the regular expression.
741: The special meaning of
742: .Cx `
743: .Ic \&&
744: .Cx \'
745: .Cx
746: in this context may be
747: suppressed by preceding it by
748: .Cx `
749: .Ic \&\e
750: .Cx \'.
751: .Cx
752: The characters
753: .Cx `
754: .Ic \&\e
755: .Ar n
756: .Cx \'
757: .Cx
758: where
759: .Ar n
760: is a digit,
761: are replaced by the text matched by the
762: .Cx Ar n
763: .Cx \'th
764: .Cx
765: regular subexpression
766: enclosed between
767: .Cx `
768: .Ic \&\e\&(
769: .Cx \'.
770: .Cx
771: and
772: .Cx `
773: .Ic \&\e\&)
774: .Cx \'.
775: .Cx
776: When
777: nested, parenthesized subexpressions
778: are present,
779: .Ar n
780: is determined by counting occurrences of
781: .Cx `
782: .Ic \&\e\&(
783: .Cx \'.
784: .Cx
785: starting from the left.
786: Lines may be split by substituting new-line characters into them.
787: The new-line in the
788: replacement string
789: must be escaped by preceding it by
790: .Cx `
791: .Ic \&\e
792: .Cx \'.
793: .Cx
794: One or two trailing delimiters may be omitted,
795: implying the
796: .Ic p
797: suffix.
798: The special form
799: .Ic s
800: followed by
801: .Ar no
802: delimiters
803: repeats the most recent substitute command
804: on the addressed lines.
805: The
806: .Ic s
807: may be followed by the letters
808: .Ic r
809: (use the most recent regular expression for the
810: left hand side, instead of the most recent
811: left hand side of a substitute command),
812: .Ic p
813: (complement the setting of the
814: .Ic p
815: suffix from the previous substitution), or
816: .Ic g
817: (complement the setting of the
818: .Ic g
819: suffix).
820: These letters may be combined in any order.
821: .Tp Cx \&(
822: .Ic \&.
823: .Cx \&,
824: .Ic \&.
825: .Cx \&)
826: .Ic \&t
827: .Ar a
828: .Cx
829: This command acts just like the
830: .Ic m
831: command, except that a copy of the addressed lines is placed
832: after address
833: .Ad a
834: (which may be 0).
835: .Cx `
836: .Ic \&.
837: .Cx \'
838: .Cx
839: is left on the last line of the copy.
840: .Tp Cx \&(
841: .Ic \&.
842: .Cx \&,
843: .Ic \&.
844: .Cx \&)
845: .Ic \&u
846: .Cx
847: The undo command restores the buffer to it's state
848: before the most recent buffer modifying command.
849: The current line is also restored.
850: Buffer modifying commands are
851: .Ic a , c , d , g , i , k , m , r , s , t ,
852: and
853: .Ic v .
854: For purposes of undo,
855: .Ic g
856: and
857: .Ic v
858: are considered to be a single buffer modifying command.
859: Undo is its own inverse.
860: When
861: .Nm ed
862: runs out of memory
863: (at about 8000 lines on any 16 bit mini-computer
864: such as the PDP-11)
865: This full undo is not possible, and
866: .Ic u
867: can only undo the effect of the most recent
868: substitute on the current line.
869: This restricted undo also applies to editor scripts
870: when
871: .Nm ed
872: is invoked with the
873: .Fl
874: option.
875: .Tp Cx \&(
876: .Ic \&1
877: .Cx \&,
878: .Ic \&$
879: .Cx \&)
880: .Ic \&v
881: .Ar/regular expression/command list
882: .Cx
883: This command is the same as the global command
884: .Ic g
885: except that the command list is executed
886: .Ic g
887: with
888: .Cx `
889: .Ic \&.
890: .Cx \'
891: .Cx
892: initially set to every line
893: .Em except
894: those
895: matching the regular expression.
896: (1, $)\w filename
897: .Tp Cx \&(
898: .Ic \&1
899: .Cx \&,
900: .Ic \&$
901: .Cx \&)
902: .Ic \&w
903: .Cx \&\ \&
904: .Ar filename
905: .Cx
906: The write command writes the addressed lines onto
907: the given file.
908: If the file does not exist,
909: it is created.
910: The file name is remembered if there was no
911: remembered file name already.
912: If no file name is given,
913: the remembered file name, if any, is used
914: (see
915: .Ic e
916: and
917: .Ic f
918: commands).
919: .Cx `
920: .Ic \&.
921: .Cx \'
922: .Cx
923: is unchanged.
924: If the command is successful, the number of characters written is
925: printed.
926: .Tp Cx \&(
927: .Ic \&1
928: .Cx \&,
929: .Ic \&$
930: .Cx \&)
931: .Ic \&W
932: .Cx \&\ \&
933: .Ar filename
934: .Cx
935: This command is the same as
936: .Ic w ,
937: except that the addressed lines are appended to the file.
938: .Tp Cx \&(
939: .Ic \&1
940: .Cx \&,
941: .Ic \&$
942: .Cx \&)
943: .Ic \&wq
944: .Cx \&\ \&
945: .Ar filename
946: .Cx
947: This command is the same as
948: .Ic w
949: except that afterwards a
950: .Ic q
951: command is done,
952: exiting the editor
953: after the file is written.
954: .Ic \&1
955: .Ic \&+1
956: .Cx \&)
957: .Ic \&z
958: .Cx \&\ \ \&or,
959: .Cx
960: .Tp Cx \&(
961: .Ic \&1
962: .Ic \&+1
963: .Cx \&)
964: .Ic \&z
965: .Ar n
966: .Cx
967: This command scrolls through the buffer starting at the addressed line.
968: 22 (or
969: .Ar n ,
970: if given)
971: lines are printed.
972: The last line printed becomes the current line.
973: The value
974: .Ar n
975: is sticky, in that it becomes the default for
976: future
977: .Ic z
978: commands.
979: .Tp Cx \&(
980: .Ic \&$
981: .Cx \&)
982: .Ic \&=
983: .Cx
984: The line number of the addressed line is typed.
985: .Cx `
986: .Ic \&.
987: .Cx \'
988: .Cx
989: is unchanged by this command.
990: .Tp Cx Ic \&!
991: .Cx <shell\ command>
992: .Cx
993: The remainder of the line after the `!' is sent
994: to
995: .Xr sh 1
996: to be interpreted as a command.
997: .Cx `
998: .Ic \&.
999: .Cx \'
1000: .Cx
1001: is unchanged.
1002: .Tp Cx \&(
1003: .Ic \&.+1
1004: .Cx \&,
1005: .Ic \&.+1
1006: .Cx \&)
1007: .Cx <newline>
1008: .Cx
1009: An address alone on a line causes the addressed line to be printed.
1010: A blank line alone is equivalent to
1011: .Ic .+1
1012: it is useful
1013: for stepping through text.
1014: If two addresses are present with no
1015: intervening semicolon,
1016: .Nm ed
1017: prints the range of lines.
1018: If they are separated by a semicolon,
1019: the second line is printed.
1020: .Tp
1021: .Pp
1022: If an interrupt signal (ASCII DEL) is sent,
1023: .Nm ed
1024: prints
1025: .Sq Li ?interrupted
1026: and returns to its command level.
1027: .Pp
1028: Some size limitations:
1029: 512 characters per line,
1030: 256 characters per global command list,
1031: 64 characters per file name,
1032: and, on mini computers,
1033: 128K characters in the temporary file.
1034: The limit on the number of lines depends on the amount of core:
1035: each line takes 2 words.
1036: .Pp
1037: When reading a file,
1038: .Nm ed
1039: discards ASCII NUL characters
1040: and all characters after the last newline.
1041: It refuses to read files containing non-ASCII characters.
1042: .Sh FILES
1043: .Dw edhup
1044: .Di L
1045: .Dp Pa /tmp/e*
1046: .Dp Pa edhup
1047: work is saved here if terminal hangs up
1048: .Dp
1049: .Sh SEE ALSO
1050: .Xr ex 1 ,
1051: .Xr sed 1 ,
1052: .Xr crypt 1
1053: .br
1054: B. W. Kernighan,
1055: .Em A Tutorial Introduction to the ED Text Editor
1056: .br
1057: B. W. Kernighan,
1058: .Em Ar Advanced editing on UNIX
1059: .Sh HISTORY
1060: The
1061: .Nm ed
1062: command appeared in Version 6 AT&T UNIX.
1063: .Sh DIAGNOSTICS
1064: .Sq Li name
1065: for inaccessible file;
1066: .Sq Li ?self-explanatory message
1067: for other errors.
1068: .Pp
1069: To protect against throwing away valuable work,
1070: a
1071: .Ic q
1072: or
1073: .Ic e
1074: command is considered to be in error, unless a
1075: .Ic w
1076: has occurred since the last buffer change.
1077: A second
1078: .Ic q
1079: or
1080: .Ic e
1081: will be obeyed regardless.
1082: .Sh BUGS
1083: The
1084: .Ic l
1085: command mishandles
1086: .Li DEL .
1087: .br
1088: The
1089: .Ic undo
1090: command causes marks to be lost on affected lines.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.