| .Dd 2016-12-27 |
| .Dt ED 1 |
| .Os sbase |
| .Sh NAME |
| .Nm ed |
| .Nd text editor |
| .Sh SYNOPSIS |
| .Nm |
| .Op Fl s |
| .Op Fl p Ar string |
| .Op Ar file |
| .Sh DESCRIPTION |
| .Nm |
| is the standard text editor. It performs line-oriented operations on a buffer; |
| The buffer's contents are manipulated in command mode and text is written to the |
| buffer in input mode. Command mode is the default. To exit input mode enter a |
| dot ('.') on a line of its own. |
| .Pp |
| If |
| .Nm |
| is invoked with a file as an argument, it will simulate an edit command and read |
| the file's contents into a buffer. Changes to this buffer are local to |
| .Nm |
| until a write command is given. |
| .Pp |
| .Nm |
| uses the basic regular expression syntax and allows any character but space and |
| newline to be used as a delimiter in regular expressions. |
| .Sh OPTIONS |
| .Bl -tag -width Ds |
| .It Fl s |
| Suppress diagnostic messages |
| .It Fl p Ar string |
| Use |
| .Ar string |
| as a prompt when in command mode |
| .El |
| .Sh EXTENDED DESCRIPTION |
| .Ss Addresses |
| Commands operate on addresses. Addresses are used to refer to lines |
| within the buffer. Address ranges may have spaces before and after the separator. |
| Unless otherwise specified, 0 is an invalid address. The following symbols are |
| valid addresses: |
| .Bl -tag -width Ds |
| .It n |
| The nth line. |
| .It . |
| The current line, or "dot". |
| .It $ |
| The last line. |
| .It + |
| The next line. |
| .It +n |
| The nth next line. |
| .It ^ or - |
| The previous line. |
| .It ^n or -n |
| The nth previous line. |
| .It x,y |
| The range of lines from x to y. The default value of x is 1, and the default |
| value of y is $. |
| .It x;y |
| As above, except that the current line is set to x. Omitting x in this case uses |
| the current line as the default value. |
| .It /re/ |
| The next line matching re. |
| .It ?re? |
| The last line matching re. |
| .It 'c |
| The line marked by c. See k below. |
| .El |
| .Ss Commands. |
| .Nm |
| expects to see one command per line, with the following exception: commands may |
| be suffixed with either a list, number, or print command. These suffixed |
| commands are run after the command they're suffixed to has executed. |
| .Pp |
| The following is the list of commands that |
| .Nm |
| knows about. The parentheses contain the default addresses that a command uses. |
| .Bl -tag -width Ds |
| .It (.)a |
| Append text after the addressed line. The dot is set to the last line |
| entered. If no text was entered, the dot is set to the addressed line. An |
| address of 0 appends to the start of the buffer. |
| .It (.,.)c |
| Delete the addressed lines and then accept input to replace them. The dot |
| is set to the last line entered. If no text was entered, the dot is set to |
| the line before the deleted lines. |
| .It (.,.)d |
| Delete the addressed lines. If there is a line after the deleted range, the |
| dot is set to it. Otherwise, the dot is set to the line before the deleted range. |
| .It e Ar file |
| Delete the contents of the buffer and load in |
| .Ar file |
| for editing, printing the bytes read to standard output. If no filename is |
| given, |
| .Nm |
| uses the currently remembered filename. The remembered filename is set to |
| .Ar file |
| for later use. |
| .It E Ar file |
| As above, but without warning if the current buffer has unsaved changes. |
| .It f Ar file |
| Set the currently remembered filename to |
| .Ar |
| file |
| , or print the currently remembered filename if |
| .Ar |
| file is omitted. |
| .It (1,$)g/re/command |
| Apply command to lines matching re. The dot is set to the matching line before |
| command is executed. When each matching line has been operated on, the dot is |
| set to the last line operated on. If no lines match then the dot remains |
| unchanged. The command used may not be g, G, v, or V. |
| .It (1,$)G/re/ |
| Interactively edit the range of line addresses that match re. The dot is set to |
| the matching line and printed before a command is input. When each matching line |
| has been operated on, the dot is set to the last line operated on. If no lines |
| match then the dot remains unchanged. The command used may not be a, c, i, g, |
| G, v, or V. |
| .It h |
| Print the reason for the most recent error. |
| .It H |
| Toggle error explanations. If on, the above behaviour is produced on all |
| subsequent errors. |
| .It (.)i |
| Insert text into the buffer before the addressed line. The dot is set to the |
| last line entered. If no text was entered, the dot is set to the addressed line |
| .It (.,.+1)j |
| Join two lines together. If only one address is given, nothing happens. The dot |
| is set to the newly joined line. |
| .It (.)kc |
| Mark the line with the lower case character c. The dot is unchanged. |
| .It (.,.)l |
| Unambiguously print the addressed lines. The dot is set to the last line written. |
| .It (.,.)m(.) |
| Move lines in the buffer to the line address on the right hand side. An address |
| of 0 on the right hand side moves to the start of the buffer. The dot is set to |
| the last line moved. |
| .It (.,.)n |
| Print the addressed lines and their numbers. The dot is set to the last line |
| printed. |
| .It (.,.)p |
| Print the addressed lines. The dot is set to the last line printed. |
| .It P |
| Toggle the prompt. Defaults to off, but is switched on if the -p flag is used. |
| .It q |
| Quit |
| .Nm |
| , warning if there are unsaved changes. |
| .It Q |
| As above, but without warning if the current buffer has unsaved changes. |
| .It ($)r Ar file |
| Read in |
| .Ar file |
| and append it to the current buffer, printing the bytes read to standard output. |
| The currently remembered filename isn't changed unless it's empty. An address of |
| 0 reads the file into the start of the buffer. |
| .It (.,.)s/re/replacement/flags |
| Substitute re for replacement in lines matching re. An & within replacement is |
| replaced with the whole string matched by re. Backrefs can be used with the form |
| \\n, where n is a positive non-zero integer. When % is the only character in |
| replacement, it is substituted for the replacement string from the last |
| substitute command. If a newline is part of replacement then the matched string |
| is split into two lines; this cannot be done as part of a g or v command. If |
| flags contains an integer n, then the nth match is replaced. If flags contains |
| g, all matches are replaced. The dot is set to the last line matched. |
| .It (.,.)t(.) |
| As m, but copying instead of moving. The dot is set to the last line added. |
| .It u |
| Undo the last change. The dot is set to whatever it was before the undone |
| command was performed. |
| .It (1.$)v/re/command |
| As with g, but operating on lines that don't match re. |
| .It (1.$)V/re/ |
| As with G, but operating on lines that don't match re. |
| .It (1,$)w Ar file |
| Write the addressed lines to |
| .Ar file |
| , overwriting its previous contents if the file exists, and print the number of |
| bytes written. If no filename is given the currently remembered filename will be |
| used instead. The dot is unchanged. |
| .It (1,$)W Ar file |
| As above, but instead of overwriting the contents of |
| .Ar file |
| the addressed lines are appended to |
| .Ar file |
| instead. |
| .It (.+1)\\n |
| Print the addressed line. Sets the dot to that line. |
| .It ($)= |
| Print the line number of the addressed line. The dot is unchanged. |
| .It & |
| Repeat the last command. |
| .It ! Ar command |
| Execute |
| .Ar command |
| using sh. If the first character of |
| .Ar command |
| is '!' then it is replaced with the text of the previous command. An unescaped % |
| is replaced with the currently remembered filename. ! does not process escape |
| characters. When |
| .Ar command |
| returns a '!' is printed. The dot is unchanged. |
| .El |
| .Sh SEE ALSO |
| .Xr sed 1 , |
| .Xr regexp 3 |
| .Sh STANDARDS |
| The |
| .Nm |
| utility is compliant with the |
| .St -p1003.1-2013 |
| specification, except where noted here: |
| g and v operate on single commands rather than lists delimited with '\\'. |
| e, E, r, w, and W commands cannot accept shell escapes. |