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

unix.superglobalmegacorp.com

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