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