|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.