Annotation of 43BSDReno/foreign/src/ed/ed.1, revision 1.1.1.1

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.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.