Annotation of 43BSDReno/share/doc/usd/18.sed/sed, revision 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.