Annotation of 43BSDReno/share/doc/usd/18.sed/sed, revision 1.1.1.1

1.1       root        1: .\"    @(#)sed 6.1 (Berkeley) 5/22/86
                      2: .\"
                      3: .EH 'USD:18-%''SED \(em A Non-interactive Text Editor'
                      4: .OH 'SED \(em A Non-interactive Text Editor''USD:18-%'
                      5: .hw de-limit
                      6: .hw de-limit-ing
                      7: .\".RP
                      8: ....TM 78-1270-1 39199 39199-11
                      9: .ND August 15, 1978
                     10: .TL
                     11: SED \(em A Non-interactive Text Editor
                     12: .AU "MH 2C-555" 3302
                     13: Lee E. McMahon
                     14: .AI
                     15: .MH
                     16: .OK
                     17: \"Context search
                     18: \"Editing
                     19: .AB
                     20: .ul
                     21: Sed
                     22: is a non-interactive context editor
                     23: that runs on the
                     24: .UX
                     25: operating system.
                     26: .ul
                     27: Sed
                     28: is
                     29: designed to be especially useful in
                     30: three cases:
                     31: .in +1i
                     32: .LP
                     33: .ti -.5i
                     34: 1)
                     35: To edit files too large for comfortable
                     36: interactive editing;
                     37: .ti -.5i
                     38: 2)
                     39: To edit any size file when the sequence
                     40: of editing commands is too complicated to be comfortably
                     41: typed in interactive mode.
                     42: .ti -.5i
                     43: 3)
                     44: To perform multiple `global' editing functions
                     45: efficiently in one pass through the input.
                     46: .in -1i
                     47: .LP
                     48: This memorandum constitutes a manual for users of
                     49: .ul
                     50: sed.
                     51: .AE
                     52: .CS 10 0 10 0 0 1
                     53: .SH
                     54: Introduction
                     55: .LP
                     56: .ul
                     57: Sed
                     58: is a non-interactive context editor designed to be especially useful in
                     59: three cases:
                     60: .in +1i
                     61: .LP
                     62: .ti -.5i
                     63: 1)
                     64: To edit files too large for comfortable
                     65: interactive editing;
                     66: .ti -.5i
                     67: 2)
                     68: To edit any size file when the sequence
                     69: of editing commands is too complicated to be comfortably
                     70: typed in interactive mode;
                     71: .ti -.5i
                     72: 3)
                     73: To perform multiple `global' editing functions
                     74: efficiently in one pass through the input.
                     75: .in -1i
                     76: .LP
                     77: Since only a few lines of the input reside in core
                     78: at one time, and no temporary files are used,
                     79: the effective size of file that can be edited is limited only
                     80: by the requirement that the input and output fit simultaneously
                     81: into available secondary storage.
                     82: .LP
                     83: Complicated editing scripts can be created separately and given
                     84: to 
                     85: .ul
                     86: sed
                     87: as a command file.
                     88: For complex edits, this saves considerable typing, and its
                     89: attendant errors.
                     90: .ul
                     91: Sed
                     92: running from a command file is much more efficient than any interactive
                     93: editor known to the author, even if that editor
                     94: can be driven by a pre-written script.
                     95: .LP
                     96: The principal loss of functions compared to an interactive editor
                     97: are lack of relative addressing (because of the line-at-a-time
                     98: operation), and lack of immediate verification that a command has
                     99: done what was intended.
                    100: .LP
                    101: .ul
                    102: Sed
                    103: is a lineal descendant of the UNIX editor,
                    104: .ul
                    105: ed.
                    106: Because of the differences between interactive and non-interactive
                    107: operation, considerable changes have been made between
                    108: .ul
                    109: ed
                    110: and
                    111: .ul
                    112: sed;
                    113: even confirmed users of
                    114: .ul
                    115: ed
                    116: will frequently be surprised (and probably chagrined),
                    117: if they rashly use 
                    118: .ul
                    119: sed
                    120: without reading Sections 2 and 3 of this document.
                    121: The most striking family resemblance between the two
                    122: editors is in the class of patterns (`regular expressions') they
                    123: recognize;
                    124: the code for matching patterns is copied almost
                    125: verbatim from the code for
                    126: .ul
                    127: ed,
                    128: and the description of regular expressions in Section 2
                    129: is copied almost verbatim from the UNIX Programmer's
                    130: Manual[1]. (Both code and description were written by Dennis
                    131: M. Ritchie.)
                    132: .LP
                    133: .SH
                    134: 1. Overall Operation
                    135: .LP
                    136: .ul
                    137: Sed
                    138: by default copies the standard input to the standard output,
                    139: perhaps performing one or more editing commands on each
                    140: line before writing it to the output.
                    141: This behavior may be modified by flags on the command line;
                    142: see Section 1.1 below.
                    143: .LP
                    144: The general format of an editing command is:
                    145: .LP
                    146: .in +1i
                    147: [address1,address2][function][arguments]
                    148: .LP
                    149: .in -1i
                    150: One or both addresses may be omitted; the format of addresses is
                    151: given in Section 2.
                    152: Any number of blanks or tabs may separate the addresses
                    153: from the function.
                    154: The function must be present; the available commands are discussed
                    155: in Section 3.
                    156: The arguments may be required or optional, according to which function
                    157: is given; again, they are discussed in Section 3 under each individual
                    158: function.
                    159: .LP
                    160: Tab characters and spaces at the beginning of lines are ignored.
                    161: .LP
                    162: .SH
                    163: 1.1. Command-line Flags
                    164: .LP
                    165: Three flags are recognized on the command line:
                    166: .in +1i
                    167: .ti -.5i
                    168: .B
                    169: -n:
                    170: .R
                    171: tells
                    172: .ul
                    173: sed
                    174: not to copy all lines, but only those specified by
                    175: .ul
                    176: p
                    177: functions or
                    178: .ul
                    179: p
                    180: flags after 
                    181: .ul
                    182: s
                    183: functions (see Section 3.3);
                    184: .ti -.5i
                    185: .B
                    186: -e:
                    187: .R
                    188: tells
                    189: .ul
                    190: sed
                    191: to take the next argument as an editing command;
                    192: .ti -.5i
                    193: .B
                    194: -f:
                    195: .R
                    196: tells
                    197: .ul
                    198: sed
                    199: to take the next argument as a file name;
                    200: the file should contain editing commands, one to a line.
                    201: .in -1i
                    202: .SH
                    203: 1.2. Order of Application of Editing Commands
                    204: .LP
                    205: Before any editing is done (in fact, before any input file is
                    206: even opened), all the editing commands are compiled into
                    207: a form which will be moderately efficient during
                    208: the execution phase (when the commands are actually applied to
                    209: lines of the input file).
                    210: The commands are compiled in the order in which they are
                    211: encountered; this is generally the order in which they will
                    212: be attempted at execution time.
                    213: The commands are applied one at a time; the input to each command
                    214: is the output of all preceding commands.
                    215: .LP
                    216: The default linear order of application of editing commands can
                    217: be changed by the flow-of-control commands,
                    218: .ul
                    219: t
                    220: and
                    221: .ul
                    222: b
                    223: (see Section 3).
                    224: Even when the order of application is changed
                    225: by these commands, it is still true that the input line to any
                    226: command is the output of any previously applied command.
                    227: .SH
                    228: 1.3.  Pattern-space
                    229: .LP
                    230: The range of pattern matches is called the pattern space.
                    231: Ordinarily, the pattern space is one line of the input text,
                    232: but more than one line can be read into the pattern space
                    233: by using the
                    234: .ul
                    235: N
                    236: command (Section 3.6.).
                    237: .LP
                    238: .SH
                    239: 1.4. Examples
                    240: .LP
                    241: Examples are scattered throughout the text.
                    242: Except where otherwise noted,
                    243: the examples all assume the following input text:
                    244: .LP
                    245: .in +.5i
                    246: .nf
                    247: In Xanadu did Kubla Khan
                    248: A stately pleasure dome decree:
                    249: Where Alph, the sacred river, ran
                    250: Through caverns measureless to man
                    251: Down to a sunless sea.
                    252: .in -.5i
                    253: .fi
                    254: .LP
                    255: (In no case is the output of the 
                    256: .ul
                    257: sed
                    258: commands to be considered an improvement
                    259: on Coleridge.)
                    260: .LP
                    261: .SH
                    262: Example:
                    263: .LP
                    264: The command
                    265: .in +.5i
                    266: .LP
                    267: 2q
                    268: .in -.5i
                    269: .LP
                    270: will quit after copying the first two lines of the input.
                    271: The output will be:
                    272: .LP
                    273: .in +.5i
                    274: .nf
                    275: In Xanadu did Kubla Khan
                    276: A stately pleasure dome decree:
                    277: .in -.5i
                    278: .fi
                    279: .LP
                    280: .SH
                    281: 2. ADDRESSES: Selecting lines for editing
                    282: .LP
                    283: Lines in the input file(s) to which editing commands are
                    284: to be applied can be selected by addresses.
                    285: Addresses may be either line numbers or context addresses.
                    286: .LP
                    287: The application of a group of commands can be controlled by
                    288: one address (or address-pair) by grouping
                    289: the commands with curly braces (`{ }')(Sec. 3.6.).
                    290: .SH
                    291: 2.1. Line-number Addresses
                    292: .LP
                    293: A line number is a decimal integer.
                    294: As each line is read from the input, a line-number counter
                    295: is incremented;
                    296: a line-number address matches (selects) the input
                    297: line which causes the internal counter to equal the
                    298: address line-number.
                    299: The counter runs cumulatively through multiple input files;
                    300: it is not reset when a new input file is opened.
                    301: .LP
                    302: As a special case, the character
                    303: $
                    304: matches the last line of the last input file.
                    305: .SH
                    306: 2.2. Context Addresses
                    307: .LP
                    308: A context address is a pattern (`regular expression') enclosed in slashes (`/').
                    309: The regular expressions recognized by
                    310: .ul
                    311: sed
                    312: are constructed as follows:
                    313: .in +1i
                    314: .LP
                    315: .ti -.5i
                    316: 1)
                    317: An ordinary character (not one of those discussed below)
                    318: is a regular expression, and matches that character.
                    319: .LP
                    320: .ti -.5i
                    321: 2)
                    322: A circumflex `^' at the beginning of a regular expression
                    323: matches the null character at the beginning of a line.
                    324: .ti -.5i
                    325: 3)
                    326: A dollar-sign `$' at the end of a regular expression
                    327: matches the null character at the end of a line.
                    328: .ti -.5i
                    329: 4)
                    330: The characters `\en' match an imbedded newline character,
                    331: but not the newline at the end of the pattern space.
                    332: .ti -.5i
                    333: 5)
                    334: A period `.' matches any character except the terminal newline
                    335: of the pattern space.
                    336: .ti -.5i
                    337: 6)
                    338: A regular expression followed by an asterisk `*' matches any
                    339: number (including 0) of adjacent occurrences of the regular
                    340: expression it follows.
                    341: .ti -.5i
                    342: 7)
                    343: A string of characters in square brackets `[ ]' matches any character
                    344: in the string, and no others.
                    345: If, however, the first character of the string is circumflex `^',
                    346: the regular expression matches any character
                    347: .ul
                    348: except
                    349: the characters in the string and the terminal newline of the pattern space.
                    350: .ti -.5i
                    351: 8)
                    352: A concatenation of regular expressions is a regular expression
                    353: which matches the concatenation of strings matched by the
                    354: components of the regular expression.
                    355: .ti -.5i
                    356: 9)
                    357: A regular expression between the sequences `\e(' and `\e)' is
                    358: identical in effect to the unadorned regular expression, but has
                    359: side-effects which are described under the
                    360: .ul
                    361: s
                    362: command below and specification 10) immediately below.
                    363: .ti -.5i
                    364: 10)
                    365: The expression
                    366: .ul
                    367: `\|\ed'
                    368: means the same string of characters matched
                    369: by an expression enclosed in `\e(' and `\e)'
                    370: earlier in the same pattern.
                    371: Here
                    372: .ul
                    373: d
                    374: is a single digit;
                    375: the string specified is that beginning with the
                    376: \fId\|\fRth
                    377: occurrence of `\e(' counting from the left.
                    378: For example, the expression
                    379: `^\e(.*\e)\e1' matches a line beginning with
                    380: two repeated occurrences of the same string.
                    381: .ti -.5i
                    382: 11)
                    383: The null regular expression standing alone (e.g., `//') is
                    384: equivalent to the  last regular expression compiled.
                    385: .in -1i
                    386: .LP
                    387: To use one of the special characters (^ $ . * [ ] \e /) as a literal
                    388: (to match an occurrence of itself in the input), precede the
                    389: special character by a backslash `\e'.
                    390: .LP
                    391: For a context address to `match' the input requires that
                    392: the whole pattern within the address match some
                    393: portion of the pattern space.
                    394: .SH
                    395: 2.3. Number of Addresses
                    396: .LP
                    397: The commands in the next section can have 0, 1, or 2 addresses.
                    398: Under each command the maximum number of allowed addresses is
                    399: given.
                    400: For a command to have more addresses than the maximum allowed
                    401: is considered an error.
                    402: .LP
                    403: If a command has no addresses, it is applied to every line
                    404: in the input.
                    405: .LP
                    406: If a command has one address, it is applied to all
                    407: lines which match that address.
                    408: .LP
                    409: If a command has two addresses, it is applied to the first
                    410: line which matches the first address, and to all subsequent lines
                    411: until (and including) the first subsequent line which matches
                    412: the second address.
                    413: Then an attempt is made on subsequent lines to again match the first
                    414: address, and the process is repeated.
                    415: .LP
                    416: Two addresses are separated by a comma.
                    417: .SH
                    418: Examples:
                    419: .LP
                    420: .nf
                    421: .in +.5i
                    422: .ta 1i 2i
                    423: /an/   matches lines 1, 3, 4 in our sample text
                    424: /an.*an/       matches line 1
                    425: /^an/  matches no lines
                    426: /./    matches all lines
                    427: /\e./  matches line 5
                    428: /r*an/ matches lines 1,3, 4 (number = zero!)
                    429: /\e(an\e).*\e1/        matches line 1
                    430: .fi
                    431: .in 0
                    432: .LP
                    433: .SH
                    434: 3. FUNCTIONS
                    435: .LP
                    436: All functions are named by a single character.
                    437: In the following summary, the maximum number of allowable addresses
                    438: is given enclosed in parentheses, then the single character
                    439: function name, possible arguments enclosed in angles (< >),
                    440: an expanded English translation of the single-character name,
                    441: and finally a description of what each function does.
                    442: The angles around the arguments are
                    443: .ul
                    444: not
                    445: part of the argument, and should not be typed
                    446: in actual editing commands.
                    447: .SH
                    448: 3.1. Whole-line Oriented Functions
                    449: .LP
                    450: .in +1i
                    451: .ti -.5i
                    452: (2)d -- delete lines
                    453: .if t .sp .5
                    454: The
                    455: .ul
                    456: d
                    457: function deletes from the file (does not write to the output)
                    458: all those lines matched by its address(es).
                    459: .if t .sp .5
                    460: It also has the side effect that no further commands are attempted
                    461: on the corpse of a deleted line;
                    462: as soon as the
                    463: .ul
                    464: d
                    465: function is executed, a new line is read from the input, and
                    466: the list of editing commands is re-started from the beginning
                    467: on the new line.
                    468: .ti -.5i
                    469: .if t .sp .5
                    470: (2)n -- next line
                    471: .if t .sp .5
                    472: The
                    473: .ul
                    474: n
                    475: function reads the next line from the input, replacing
                    476: the current line.
                    477: The current line is written to the output if it should
                    478: be.
                    479: The list of editing commands is continued 
                    480: following the 
                    481: .ul
                    482: n
                    483: command.
                    484: .if t .sp .5
                    485: .nf
                    486: .in -.5i
                    487: (1)a\e
                    488: <text> -- append lines
                    489: .in +.5i
                    490: .fi
                    491: .if t .sp .5
                    492: The
                    493: .ul
                    494: a
                    495: function causes the argument <text> to be written to the
                    496: output after the line matched by its address.
                    497: The
                    498: .ul
                    499: a
                    500: command is inherently multi-line;
                    501: .ul
                    502: a
                    503: must appear at the end of a line, and <text> may contain
                    504: any number of lines.
                    505: To preserve the one-command-to-a-line fiction,
                    506: the interior newlines must be hidden by a
                    507: backslash character (`\e') immediately preceding the
                    508: newline.
                    509: The <text> argument is terminated by the first unhidden
                    510: newline (the first one not immediately preceded
                    511: by backslash).
                    512: .if t .sp .5
                    513: Once an
                    514: .ul
                    515: a
                    516: function is successfully executed, <text> will be
                    517: written to the output regardless of what later commands do to
                    518: the line which triggered it.
                    519: The triggering line may be 
                    520: deleted entirely; <text> will still be written to the output.
                    521: .if t .sp .5
                    522: The <text> is not scanned for address matches, and no editing
                    523: commands are attempted on it.
                    524: It does not cause any change in the line-number counter.
                    525: .if t .sp .5
                    526: .nf
                    527: .in -.5i
                    528: (1)i\e
                    529: <text> -- insert lines
                    530: .in +.5i
                    531: .fi
                    532: .if t .sp .5
                    533: The
                    534: .ul
                    535: i
                    536: function  behaves identically to the
                    537: .ul
                    538: a
                    539: function, except that <text> is written to the output
                    540: .ul
                    541: before
                    542: the matched line.
                    543: All other comments about the
                    544: .ul
                    545: a
                    546: function apply to the
                    547: .ul
                    548: i
                    549: function as well.
                    550: .if t .sp .5
                    551: .nf
                    552: .in -.5i
                    553: (2)c\e
                    554: <text> -- change lines
                    555: .in +.5i
                    556: .fi
                    557: .if t .sp .5
                    558: The
                    559: .ul
                    560: c
                    561: function deletes the lines selected by its address(es),
                    562: and replaces them with the lines in <text>.
                    563: Like
                    564: .ul
                    565: a
                    566: and
                    567: .ul
                    568: i,
                    569: .ul
                    570: c
                    571: must be followed by a newline hidden by a backslash;
                    572: and interior new lines in <text> must be hidden by
                    573: backslashes.
                    574: .if t .sp .5
                    575: The
                    576: .ul
                    577: c
                    578: command may have two addresses, and therefore select a range
                    579: of lines.
                    580: If it does, all the lines in the range are deleted, but only
                    581: one copy of <text> is written to the output,
                    582: .ul
                    583: not
                    584: one copy per line deleted.
                    585: As with
                    586: .ul
                    587: a
                    588: and
                    589: .ul
                    590: i,
                    591: <text> is not scanned for address matches, and no
                    592: editing commands are attempted on it.
                    593: It does not change the  line-number counter.
                    594: .if t .sp .5
                    595: After a line has been deleted by a
                    596: .ul
                    597: c
                    598: function, no further commands are attempted on the corpse.
                    599: .if t .sp .5
                    600: If text is appended after a line by
                    601: .ul
                    602: a
                    603: or
                    604: .ul
                    605: r
                    606: functions, and the line is subsequently changed, the text
                    607: inserted by the
                    608: .ul
                    609: c
                    610: function will be placed
                    611: .ul
                    612: before
                    613: the text of the
                    614: .ul
                    615: a
                    616: or
                    617: .ul
                    618: r
                    619: functions.
                    620: (The
                    621: .ul
                    622: r
                    623: function is described in Section 3.4.)
                    624: .if t .sp .5
                    625: .in -1i
                    626: .ul
                    627: Note:
                    628: Within the text put in the output by these functions,
                    629: leading blanks and tabs will disappear, as always in 
                    630: .ul
                    631: sed
                    632: commands.
                    633: To get leading blanks and tabs into the output, precede the first
                    634: desired blank or tab by a backslash; the backslash will not
                    635: appear in the output.
                    636: .SH
                    637: Example:
                    638: .LP
                    639: The list of editing commands:
                    640: .LP
                    641: .in +.5i
                    642: .nf
                    643: n
                    644: a\e
                    645: XXXX
                    646: d
                    647: .in -.5i
                    648: .fi
                    649: .LP
                    650: applied to our standard input, produces:
                    651: .LP
                    652: .in +.5i
                    653: .nf
                    654: In Xanadu did Kubhla Khan
                    655: XXXX
                    656: Where Alph, the sacred river, ran
                    657: XXXX
                    658: Down to a sunless sea.
                    659: .in -.5i
                    660: .fi
                    661: .LP
                    662: In this particular case,
                    663: the same effect would be produced by either
                    664: of the two following command lists:
                    665: .LP
                    666: .in +.5i
                    667: .nf
                    668: n              n
                    669: i\e            c\e
                    670: XXXX   XXXX
                    671: d
                    672: .in -.5i
                    673: .fi
                    674: .LP
                    675: .in 0
                    676: .SH
                    677: 3.2. Substitute Function
                    678: .LP
                    679: One very important function changes parts of lines selected by
                    680: a context search within the line.
                    681: .if t .sp .5
                    682: .in +1i
                    683: .ti -.5i
                    684: (2)s<pattern><replacement><flags> -- substitute
                    685: .if t .sp .5
                    686: The
                    687: .ul
                    688: s
                    689: function replaces
                    690: .ul
                    691: part
                    692: of a line (selected by <pattern>) with <replacement>.
                    693: It can best be read:
                    694: .if t .sp .5
                    695: .ti +1i
                    696: Substitute for <pattern>, <replacement>
                    697: .if t .sp .5
                    698: The <pattern> argument contains a pattern,
                    699: exactly like the patterns in addresses (see 2.2 above).
                    700: The only difference between <pattern> and a context address is
                    701: that the context address must be delimited by slash (`/') characters;
                    702: <pattern> may be delimited by any character other than space or
                    703: newline.
                    704: .if t .sp .5
                    705: By default, only the first string matched by <pattern> is replaced,
                    706: but see the
                    707: .ul
                    708: g
                    709: flag below.
                    710: .if t .sp .5
                    711: The
                    712: <replacement> argument begins immediately after the
                    713: second delimiting character of <pattern>, and must be followed
                    714: immediately by another instance of the delimiting character.
                    715: (Thus there are exactly 
                    716: .ul
                    717: three
                    718: instances of the delimiting character.)
                    719: .if t .sp .5
                    720: The <replacement> is not a pattern,
                    721: and the characters which are special in patterns
                    722: do not have special meaning in <replacement>.
                    723: Instead, other characters are special:
                    724: .if t .sp .5
                    725: .in +1i
                    726: .ti -.5i
                    727: &      is replaced by the string matched by <pattern>
                    728: .if t .sp .5
                    729: .ti -.5i
                    730: .ul
                    731: \ed
                    732: (where
                    733: .ul
                    734: d
                    735: is a single digit) is replaced by the \fId\fRth substring
                    736: matched by parts of <pattern> enclosed in `\e(' and `\e)'.
                    737: If nested substrings occur in <pattern>, the \fId\fRth
                    738: is determined by counting opening delimiters (`\e(').
                    739: .if t .sp .5
                    740: As in patterns, special characters may be made
                    741: literal by preceding them with backslash (`\e').
                    742: .if t .sp .5
                    743: .in -1i
                    744: The <flags> argument may contain the following flags:
                    745: .if t .sp .5
                    746: .in +1i
                    747: .ti -.5i
                    748: g -- substitute <replacement> for all (non-overlapping)
                    749: instances of <pattern> in the line.
                    750: After a successful substitution, the scan for the next
                    751: instance of <pattern> begins just after the end of the
                    752: inserted characters; characters put into the line from
                    753: <replacement> are not rescanned.
                    754: .if t .sp .5
                    755: .ti -.5i
                    756: p -- print the line if a successful replacement was done.
                    757: The
                    758: .ul
                    759: p
                    760: flag causes the line to be written to the output if and only
                    761: if a substitution was actually made by the
                    762: .ul
                    763: s
                    764: function.
                    765: Notice that if several
                    766: .ul
                    767: s
                    768: functions, each followed by a
                    769: .ul
                    770: p
                    771: flag, successfully substitute in the same input line,
                    772: multiple copies of the line will be written to the
                    773: output: one for each successful substitution.
                    774: .if t .sp .5
                    775: .ti -.5i
                    776: w <filename> -- write the line to a file if a successful
                    777: replacement was done.
                    778: The
                    779: .ul
                    780: w
                    781: flag causes lines which are actually substituted by the
                    782: .ul
                    783: s
                    784: function to be written to a file named by <filename>.
                    785: If <filename> exists before
                    786: .ul
                    787: sed
                    788: is run, it is overwritten;
                    789: if not, it is created.
                    790: .if t .sp .5
                    791: A single space must separate
                    792: .ul
                    793: w
                    794: and <filename>.
                    795: .if t .sp .5
                    796: The possibilities of multiple, somewhat different copies of
                    797: one input line being written are the same as for 
                    798: .ul
                    799: p.
                    800: .if t .sp .5
                    801: A maximum of 10 different file names may be mentioned after
                    802: .ul
                    803: w
                    804: flags and
                    805: .ul
                    806: w
                    807: functions (see below), combined.
                    808: .in 0
                    809: .SH
                    810: Examples:
                    811: .LP
                    812: The following command, applied to our standard input,
                    813: .LP
                    814: .in +.5i
                    815: s/to/by/w changes
                    816: .in -.5i
                    817: .LP
                    818: produces, on the standard output:
                    819: .LP
                    820: .in +.5i
                    821: .nf
                    822: In Xanadu did Kubhla Khan
                    823: A stately pleasure dome decree:
                    824: Where Alph, the sacred river, ran
                    825: Through caverns measureless by man
                    826: Down by a sunless sea.
                    827: .fi
                    828: .in -.5i
                    829: .LP
                    830: and, on the file `changes':
                    831: .LP
                    832: .in +.5i
                    833: .nf
                    834: Through caverns measureless by man
                    835: Down by a sunless sea.
                    836: .fi
                    837: .in -.5i
                    838: .LP
                    839: If the nocopy option is in effect, the command:
                    840: .LP
                    841: .in +.5i
                    842: .nf
                    843: s/[.,;?:]/*P&*/gp
                    844: .fi
                    845: .in -.5i
                    846: .LP
                    847: produces:
                    848: .LP
                    849: .in +.5i
                    850: .nf
                    851: A stately pleasure dome decree*P:*
                    852: Where Alph*P,* the sacred river*P,* ran
                    853: Down to a sunless sea*P.*
                    854: .LP
                    855: .in -.5i
                    856: .fi
                    857: Finally, to illustrate the effect of the
                    858: .ul
                    859: g
                    860: flag,
                    861: the command:
                    862: .LP
                    863: .in +.5i
                    864: .nf
                    865: /X/s/an/AN/p
                    866: .in -.5i
                    867: .fi
                    868: .LP
                    869: produces (assuming nocopy mode):
                    870: .in +.5i
                    871: .LP
                    872: .nf
                    873: In XANadu did Kubhla Khan
                    874: .fi
                    875: .in -.5i
                    876: .LP
                    877: and the command:
                    878: .LP
                    879: .in +.5i
                    880: .nf
                    881: /X/s/an/AN/gp
                    882: .in -.5i
                    883: .fi
                    884: .LP
                    885: produces:
                    886: .LP
                    887: .in +.5i
                    888: .nf
                    889: In XANadu did Kubhla KhAN
                    890: .in -.5i
                    891: .fi
                    892: .LP
                    893: .in 0
                    894: .SH
                    895: 3.3. Input-output Functions
                    896: .LP
                    897: .in +1i
                    898: .ti -.5i
                    899: (2)p -- print
                    900: .if t .sp .5
                    901: The print function writes the addressed lines to the standard output file.
                    902: They are written at the time the
                    903: .ul
                    904: p
                    905: function is encountered, regardless of what succeeding
                    906: editing commands may do to the lines.
                    907: .if t .sp .5
                    908: .ti -.5i
                    909: (2)w <filename> -- write on <filename>
                    910: .if t .sp .5
                    911: The write function writes the addressed lines to the file named
                    912: by <filename>.
                    913: If the file previously existed, it is overwritten; if not, it is created.
                    914: The lines are written exactly as they exist when the write function
                    915: is encountered for each line, regardless of what subsequent
                    916: editing commands may do to them.
                    917: .if t .sp .5
                    918: Exactly one space must separate the
                    919: .ul
                    920: w
                    921: and <filename>.
                    922: .if t .sp .5
                    923: A maximum of ten different files may be mentioned in write
                    924: functions and
                    925: .ul
                    926: w
                    927: flags after
                    928: .ul
                    929: s
                    930: functions, combined.
                    931: .if t .sp .5
                    932: .ti -.5i
                    933: (1)r <filename> -- read the contents of a file
                    934: .if t .sp .5
                    935: The read function reads the contents of <filename>, and appends
                    936: them after the line matched by the address.
                    937: The file is read and appended regardless of what subsequent
                    938: editing commands do to the line which matched its address.
                    939: If
                    940: .ul
                    941: r
                    942: and
                    943: .ul
                    944: a
                    945: functions are executed on the same line,
                    946: the text from the 
                    947: .ul
                    948: a
                    949: functions and the
                    950: .ul
                    951: r
                    952: functions is written to the output in the order that
                    953: the functions are executed.
                    954: .if t .sp .5
                    955: Exactly one space must separate the
                    956: .ul
                    957: r
                    958: and <filename>.
                    959: If a file mentioned by a
                    960: .ul
                    961: r
                    962: function cannot be opened, it is considered a null file,
                    963: not an error, and no diagnostic is given.
                    964: .if t .sp .5
                    965: .in -1i
                    966: NOTE:
                    967: Since there is a limit to the number of files that can be opened
                    968: simultaneously, care should be taken that no more than ten
                    969: files be mentioned in
                    970: .ul
                    971: w
                    972: functions or flags; that number is reduced by one if any
                    973: .ul
                    974: r
                    975: functions are present.
                    976: (Only one read file is open at one time.)
                    977: .in 0
                    978: .SH
                    979: Examples
                    980: .LP
                    981: Assume that the file `note1'
                    982: has the following contents:
                    983: .LP
                    984: .in +1i
                    985: Note:  Kubla Khan (more properly Kublai Khan; 1216-1294)
                    986: was the grandson and most eminent successor of Genghiz
                    987: (Chingiz) Khan, and founder of the Mongol dynasty in China.
                    988: .LP
                    989: .in 0
                    990: Then the following command:
                    991: .LP
                    992: .nf
                    993: .in +.5i
                    994: /Kubla/r note1
                    995: .in -.5i
                    996: .fi
                    997: .LP
                    998: produces:
                    999: .LP
                   1000: .nf
                   1001: .in +.5i
                   1002: In Xanadu did Kubla Khan
                   1003: .in +.5i
                   1004: .fi
                   1005: Note:  Kubla Khan (more properly Kublai Khan; 1216-1294)
                   1006: was the grandson and most eminent successor of Genghiz
                   1007: (Chingiz) Khan, and founder of the Mongol dynasty in China.
                   1008: .in -.5i
                   1009: .nf
                   1010: A stately pleasure dome decree:
                   1011: Where Alph, the sacred river, ran
                   1012: Through caverns measureless to man
                   1013: Down to a sunless sea.
                   1014: .in -.5i
                   1015: .fi
                   1016: .LP
                   1017: .in 0
                   1018: .SH
                   1019: 3.4.
                   1020: Multiple Input-line Functions
                   1021: .LP
                   1022: Three functions, all spelled with capital letters, deal
                   1023: specially with pattern spaces containing imbedded newlines;
                   1024: they are intended principally to provide pattern matches across
                   1025: lines in the input.
                   1026: .if t .sp .5
                   1027: .in +1i
                   1028: .ti -.5i
                   1029: (2)N -- Next line
                   1030: .if t .sp .5
                   1031: The next input line is appended to the current line in the
                   1032: pattern space; the two input lines are separated by an imbedded
                   1033: newline.
                   1034: Pattern matches may extend across the imbedded newline(s).
                   1035: .if t .sp .5
                   1036: .ti -.5i
                   1037: (2)D -- Delete first part of the pattern space
                   1038: .if t .sp .5
                   1039: Delete up to and including the first newline character
                   1040: in the current pattern space.
                   1041: If the pattern space becomes empty (the only newline
                   1042: was the terminal newline),
                   1043: read another line from the input.
                   1044: In any case, begin the list of editing commands again
                   1045: from its beginning.
                   1046: .if t .sp .5
                   1047: .ti -.5i
                   1048: (2)P -- Print first part of the pattern space
                   1049: .if t .sp .5
                   1050: Print up to and including the first newline in the pattern space.
                   1051: .if t .sp .5
                   1052: .in 0
                   1053: The 
                   1054: .ul
                   1055: P
                   1056: and
                   1057: .ul
                   1058: D
                   1059: functions are equivalent to their lower-case counterparts
                   1060: if there are no imbedded newlines in the pattern space.
                   1061: .in 0
                   1062: .SH
                   1063: 3.5.  Hold and Get Functions
                   1064: .LP
                   1065: Four functions save and retrieve part of the input for possible later
                   1066: use.
                   1067: .if t .sp .5
                   1068: .in 1i
                   1069: .ti -.5i
                   1070: (2)h -- hold pattern space
                   1071: .if t .sp .5
                   1072: The
                   1073: .ul
                   1074: h
                   1075: functions copies the contents of the pattern space
                   1076: into a hold area (destroying the previous contents of the
                   1077: hold area).
                   1078: .if t .sp .5
                   1079: .ti -.5i
                   1080: (2)H -- Hold pattern space
                   1081: .if t .sp .5
                   1082: The
                   1083: .ul
                   1084: H
                   1085: function appends the contents of the pattern space
                   1086: to the contents of the hold area; the former and new contents
                   1087: are separated by a newline.
                   1088: .if t .sp .5
                   1089: .ti -.5i
                   1090: (2)g -- get contents of hold area
                   1091: .if t .sp .5
                   1092: The
                   1093: .ul
                   1094: g
                   1095: function copies the contents of the hold area into
                   1096: the pattern space (destroying the previous contents of the
                   1097: pattern space).
                   1098: .if t .sp .5
                   1099: .ti -.5i
                   1100: (2)G -- Get contents of hold area
                   1101: .if t .sp .5
                   1102: The
                   1103: .ul
                   1104: G
                   1105: function appends the contents of the hold area to the
                   1106: contents of the pattern space; the former and new contents are separated by
                   1107: a newline.
                   1108: .if t .sp .5
                   1109: .ti -.5i
                   1110: (2)x -- exchange
                   1111: .if t .sp .5
                   1112: The exchange command interchanges the contents
                   1113: of the pattern space and the hold area.
                   1114: .in 0
                   1115: .SH
                   1116: Example
                   1117: .LP
                   1118: The commands
                   1119: .nf
                   1120: .if t .sp .5
                   1121:        1h
                   1122:        1s/ did.*//
                   1123:        1x
                   1124:        G
                   1125:        s/\en/  :/
                   1126: .if t .sp .5
                   1127: .fi
                   1128: applied to our standard example, produce:
                   1129: .nf
                   1130: .if t .sp .5
                   1131:        In Xanadu did Kubla Khan  :In Xanadu
                   1132:        A stately pleasure dome decree:  :In Xanadu
                   1133:        Where Alph, the sacred river, ran  :In Xanadu
                   1134:        Through caverns measureless to man  :In Xanadu
                   1135:        Down to a sunless sea.  :In Xanadu
                   1136: .if t .sp .5
                   1137: .fi
                   1138: .SH
                   1139: 3.6.  Flow-of-Control Functions
                   1140: .LP
                   1141: These functions do no editing on the input
                   1142: lines, but control the application of functions
                   1143: to the lines selected by the address part.
                   1144: .if t .sp .5
                   1145: .in +1i
                   1146: .ti -.5i
                   1147: (2)! -- Don't
                   1148: .if t .sp .5
                   1149: The
                   1150: .ul
                   1151: Don't
                   1152: command causes the next command
                   1153: (written on the same line), to be applied to all and only those input lines
                   1154: .ul
                   1155: not
                   1156: selected by the adress part.
                   1157: .if t .sp .5
                   1158: .ti -.5i
                   1159: (2){ -- Grouping
                   1160: .if t .sp .5
                   1161: The grouping command `{' causes the
                   1162: next set of commands to be applied
                   1163: (or not applied) as a block to the
                   1164: input lines selected by the addresses
                   1165: of the grouping command.
                   1166: The first of the commands under control of the grouping
                   1167: may appear on the same line as the
                   1168: `{' or on the next line.
                   1169: .LP
                   1170: The group of commands is terminated by a
                   1171: matching `}' standing on a line by itself.
                   1172: .LP
                   1173: Groups can be nested.
                   1174: .ti -.5i
                   1175: .if t .sp .5
                   1176: (0):<label> -- place a label
                   1177: .if t .sp .5
                   1178: The label function marks a place in the list
                   1179: of editing commands which may be referred to by
                   1180: .ul
                   1181: b
                   1182: and
                   1183: .ul
                   1184: t
                   1185: functions.
                   1186: The <label> may be any sequence of eight or fewer characters;
                   1187: if two different colon functions have identical labels,
                   1188: a compile time diagnostic will be generated, and
                   1189: no execution attempted.
                   1190: .if t .sp .5
                   1191: .ti -.5i
                   1192: (2)b<label> -- branch to label
                   1193: .if t .sp .5
                   1194: The branch function causes  the sequence of editing commands being
                   1195: applied to the current input line to be restarted immediately
                   1196: after the place where a colon function with the same <label>
                   1197: was encountered.
                   1198: If no colon function with the same label can be found after
                   1199: all the editing commands have been compiled, a compile time diagnostic
                   1200: is produced, and no execution is attempted.
                   1201: .if t .sp .5
                   1202: A
                   1203: .ul
                   1204: b
                   1205: function with no <label> is taken to be a branch to the end of the
                   1206: list of editing commands;
                   1207: whatever should be done with the current input line is done, and
                   1208: another input line is read; the list of editing commands is restarted from the
                   1209: beginning on the new line.
                   1210: .if t .sp .5
                   1211: .ti -.5i
                   1212: (2)t<label> -- test substitutions
                   1213: .if t .sp .5
                   1214: The
                   1215: .ul
                   1216: t
                   1217: function tests whether 
                   1218: .ul
                   1219: any
                   1220: successful substitutions have been made on the current input
                   1221: line;
                   1222: if so, it branches to <label>;
                   1223: if not, it does nothing.
                   1224: The flag which indicates that a successful substitution has
                   1225: been executed is reset by:
                   1226: .if t .sp .5
                   1227: .in +1i
                   1228: 1) reading a new input line, or
                   1229: .br
                   1230: 2) executing a
                   1231: .ul
                   1232: t
                   1233: function.
                   1234: .if t .sp .5
                   1235: .in 0
                   1236: .SH
                   1237: 3.7. Miscellaneous Functions
                   1238: .LP
                   1239: .in +1i
                   1240: .ti -.5i
                   1241: (1)= -- equals
                   1242: .if t .sp .5
                   1243: The = function writes to the standard output the line number of the
                   1244: line matched by its address.
                   1245: .if t .sp .5
                   1246: .ti -.5i
                   1247: (1)q -- quit
                   1248: .if t .sp .5
                   1249: The
                   1250: .ul
                   1251: q
                   1252: function causes the current line to be written to the
                   1253: output (if it should be), any appended or read text to be written, and
                   1254: execution to be terminated.
                   1255: .in 0
                   1256: .SH
                   1257: .SH
                   1258: Reference
                   1259: .IP [1]
                   1260: Ken Thompson and Dennis M. Ritchie,
                   1261: .ul
                   1262: The UNIX Programmer's Manual.
                   1263: Bell Laboratories, 1978.

unix.superglobalmegacorp.com

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