|  | .TH ED 1 | 
|  | .SH NAME | 
|  | ed \- text editor | 
|  | .SH SYNOPSIS | 
|  | .B ed | 
|  | [ | 
|  | .B - | 
|  | ] | 
|  | [ | 
|  | .B -o | 
|  | ] | 
|  | [ | 
|  | .I file | 
|  | ] | 
|  | .SH DESCRIPTION | 
|  | .I Ed | 
|  | is a venerable text editor. | 
|  | .PP | 
|  | If a | 
|  | .I file | 
|  | argument is given, | 
|  | .I ed | 
|  | simulates an | 
|  | .L e | 
|  | command (see below) on that file: | 
|  | it is read into | 
|  | .I ed's | 
|  | buffer so that it can be edited. | 
|  | The options are | 
|  | .TP | 
|  | .B - | 
|  | Suppress the printing | 
|  | of character counts by | 
|  | .LR e , | 
|  | .LR r , | 
|  | and | 
|  | .L w | 
|  | commands and of the confirming | 
|  | .L ! | 
|  | by | 
|  | .L ! | 
|  | commands. | 
|  | .TP | 
|  | .B -o | 
|  | (for output piping) | 
|  | Write all output to the standard error file except writing by | 
|  | .L w | 
|  | commands. | 
|  | If no | 
|  | .I file | 
|  | is given, make | 
|  | .B /dev/stdout | 
|  | the remembered file; see the | 
|  | .L e | 
|  | command below. | 
|  | .PP | 
|  | .I Ed | 
|  | operates on a `buffer', a copy of the file it is editing; | 
|  | changes made | 
|  | in the buffer have no effect on the file until a | 
|  | .L w | 
|  | (write) | 
|  | command is given. | 
|  | The copy of the text being edited resides | 
|  | in a temporary file called the | 
|  | .IR buffer . | 
|  | .PP | 
|  | Commands to | 
|  | .I ed | 
|  | have a simple and regular structure: zero, one, or | 
|  | two | 
|  | .I addresses | 
|  | followed by a single character | 
|  | .IR command , | 
|  | possibly | 
|  | followed by parameters to the command. | 
|  | These addresses specify one or more lines in the buffer. | 
|  | Missing addresses are supplied by default. | 
|  | .PP | 
|  | In general, only one command may appear on a line. | 
|  | Certain commands allow the | 
|  | addition of text to the buffer. | 
|  | While | 
|  | .I ed | 
|  | is accepting text, it is said | 
|  | to be in | 
|  | .I  "input mode." | 
|  | In this mode, no commands are recognized; | 
|  | all input is merely collected. | 
|  | Input mode is left by typing a period | 
|  | .L . | 
|  | alone at the | 
|  | beginning of a line. | 
|  | .PP | 
|  | .I Ed | 
|  | supports the | 
|  | .I "regular expression" | 
|  | notation described in | 
|  | .IR regexp (7). | 
|  | Regular expressions are used in addresses to specify | 
|  | lines and in one command | 
|  | (see | 
|  | .I s | 
|  | below) | 
|  | to specify a portion of a line which is to be replaced. | 
|  | If it is desired to use one of | 
|  | the regular expression metacharacters as an ordinary | 
|  | character, that character may be preceded by | 
|  | .RB ` \e '. | 
|  | This also applies to the character bounding the regular | 
|  | expression (often | 
|  | .LR / ) | 
|  | and to | 
|  | .L \e | 
|  | itself. | 
|  | .PP | 
|  | To understand addressing in | 
|  | .I ed | 
|  | it is necessary to know that at any time there is a | 
|  | .I "current line." | 
|  | Generally, the current line is | 
|  | the last line affected by a command; however, | 
|  | the exact effect on the current line | 
|  | is discussed under the description of | 
|  | each command. | 
|  | Addresses are constructed as follows. | 
|  | .TP | 
|  | 1. | 
|  | The character | 
|  | .LR . , | 
|  | customarily called `dot', | 
|  | addresses the current line. | 
|  | .TP | 
|  | 2. | 
|  | The character | 
|  | .L $ | 
|  | addresses the last line of the buffer. | 
|  | .TP | 
|  | 3. | 
|  | A decimal number | 
|  | .I n | 
|  | addresses the | 
|  | .IR n -th | 
|  | line of the buffer. | 
|  | .TP | 
|  | 4. | 
|  | .BI \'x | 
|  | addresses the line marked with the name | 
|  | .IR x , | 
|  | which must be a lower-case letter. | 
|  | Lines are marked with the | 
|  | .L k | 
|  | command. | 
|  | .TP | 
|  | 5. | 
|  | A regular expression enclosed in slashes ( | 
|  | .LR / ) | 
|  | addresses | 
|  | the line found by searching forward from the current line | 
|  | and stopping at the first line containing a | 
|  | string that matches the regular expression. | 
|  | If necessary the search wraps around to the beginning of the | 
|  | buffer. | 
|  | .TP | 
|  | 6. | 
|  | A regular expression enclosed in queries | 
|  | .L ? | 
|  | addresses | 
|  | the line found by searching backward from the current line | 
|  | and stopping at the first line containing | 
|  | a string that matches the regular expression. | 
|  | If necessary | 
|  | the search wraps around to the end of the buffer. | 
|  | .TP | 
|  | 7. | 
|  | An address followed by a plus sign | 
|  | .L + | 
|  | or a minus sign | 
|  | .L - | 
|  | followed by a decimal number specifies that address plus | 
|  | (resp. minus) the indicated number of lines. | 
|  | The plus sign may be omitted. | 
|  | .TP | 
|  | 8. | 
|  | An address followed by | 
|  | .L + | 
|  | (or | 
|  | .LR - ) | 
|  | followed by a | 
|  | regular expression enclosed in slashes specifies the first | 
|  | matching line following (or preceding) that address. | 
|  | The search wraps around if necessary. | 
|  | The | 
|  | .L + | 
|  | may be omitted, so | 
|  | .L 0/x/ | 
|  | addresses the | 
|  | .I first | 
|  | line in the buffer with an | 
|  | .LR x . | 
|  | Enclosing the regular expression in | 
|  | .L ? | 
|  | reverses the search direction. | 
|  | .TP | 
|  | 9. | 
|  | If an address begins with | 
|  | .L + | 
|  | or | 
|  | .L - | 
|  | the addition or subtraction is taken with respect to the current line; | 
|  | e.g.\& | 
|  | .L -5 | 
|  | is understood to mean | 
|  | .LR .-5 . | 
|  | .TP | 
|  | 10. | 
|  | If an address ends with | 
|  | .L + | 
|  | or | 
|  | .LR - , | 
|  | then 1 is added (resp. subtracted). | 
|  | As a consequence of this rule and rule 9, | 
|  | the address | 
|  | .L - | 
|  | refers to the line before the current line. | 
|  | Moreover, | 
|  | trailing | 
|  | .L + | 
|  | and | 
|  | .L - | 
|  | characters | 
|  | have cumulative effect, so | 
|  | .L -- | 
|  | refers to the current | 
|  | line less 2. | 
|  | .TP | 
|  | 11. | 
|  | To maintain compatibility with earlier versions of the editor, | 
|  | the character | 
|  | .L ^ | 
|  | in addresses is | 
|  | equivalent to | 
|  | .LR - . | 
|  | .PP | 
|  | Commands may require zero, one, or two addresses. | 
|  | Commands which require no addresses regard the presence | 
|  | of an address as an error. | 
|  | Commands which accept one or two addresses | 
|  | assume default addresses when insufficient are given. | 
|  | If more addresses are given than a command requires, | 
|  | the last one or two (depending on what is accepted) are used. | 
|  | .PP | 
|  | Addresses are separated from each other typically by a comma | 
|  | .LR , . | 
|  | They may also be separated by a semicolon | 
|  | .LR ; . | 
|  | In this case the current line | 
|  | is set to | 
|  | the previous address before the next address is interpreted. | 
|  | If no address precedes a comma or semicolon, line 1 is assumed; | 
|  | if no address follows, the last line of the buffer is assumed. | 
|  | The second address of any two-address sequence | 
|  | must correspond to a line following the line corresponding to the first address. | 
|  | .PP | 
|  | In the following list of | 
|  | .I ed | 
|  | commands, the default addresses | 
|  | are shown in parentheses. | 
|  | The parentheses are not part of | 
|  | the address, but are used to show that the given addresses are | 
|  | the default. | 
|  | `Dot' means the current line. | 
|  | .TP | 
|  | .RB (\|\fL.\fP\|) \|a | 
|  | .br | 
|  | .ns | 
|  | .TP | 
|  | <text> | 
|  | .br | 
|  | .ns | 
|  | .TP | 
|  | .B . | 
|  | Read the given text | 
|  | and append it after the addressed line. | 
|  | Dot is left | 
|  | on the last line input, if there | 
|  | were any, otherwise at the addressed line. | 
|  | Address | 
|  | .L 0 | 
|  | is legal for this command; text is placed | 
|  | at the beginning of the buffer. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|b [ +- ][\fIpagesize\fP][ pln\fR] | 
|  | Browse. | 
|  | Print a `page', normally 20 lines. | 
|  | The optional | 
|  | .L + | 
|  | (default) or | 
|  | .L - | 
|  | specifies whether the next or previous | 
|  | page is to be printed. | 
|  | The optional | 
|  | .I pagesize | 
|  | is the number of lines in a page. | 
|  | The optional | 
|  | .LR p , | 
|  | .LR n , | 
|  | or | 
|  | .L l | 
|  | causes printing in the specified format, initially | 
|  | .LR p . | 
|  | Pagesize and format are remembered between | 
|  | .L b | 
|  | commands. | 
|  | Dot is left at the last line displayed. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|c | 
|  | .br | 
|  | .ns | 
|  | .TP | 
|  | <text> | 
|  | .br | 
|  | .ns | 
|  | .TP | 
|  | .B . | 
|  | Change. | 
|  | Delete the addressed lines, then accept input | 
|  | text to replace these lines. | 
|  | Dot is left at the last line input; if there were none, | 
|  | it is left at the line preceding the deleted lines. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|d | 
|  | Delete the addressed lines from the buffer. | 
|  | Dot is set to the line following the last line deleted, or to | 
|  | the last line of the buffer if the deleted lines had no successor. | 
|  | .TP | 
|  | .BI e " filename" | 
|  | Edit. | 
|  | Delete the entire contents of the buffer; | 
|  | then read the named file into the buffer. | 
|  | Dot is set to the last line of the buffer. | 
|  | The number of characters read is typed. | 
|  | The file name is remembered for possible use in later | 
|  | .LR e , | 
|  | .LR r , | 
|  | or | 
|  | .L w | 
|  | commands. | 
|  | If | 
|  | .I filename | 
|  | is missing, the remembered name is used. | 
|  | .TP | 
|  | .BI E " filename" | 
|  | Unconditional | 
|  | .LR e ; | 
|  | see | 
|  | .RL ` q ' | 
|  | below. | 
|  | .TP | 
|  | .BI f " filename" | 
|  | Print the currently remembered file name. | 
|  | If | 
|  | .I filename | 
|  | is given, | 
|  | the currently remembered file name is first changed to | 
|  | .IR filename . | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP/\fIcommand\ list\fP | 
|  | .PD 0 | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP/ | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|g/\fIregular\ expression\fP | 
|  | .PD | 
|  | Global. | 
|  | First mark every line which matches | 
|  | the given | 
|  | .IR regular expression . | 
|  | Then for every such line, execute the | 
|  | .I command list | 
|  | with dot initially set to that line. | 
|  | A single command or the first of multiple commands | 
|  | appears on the same line with the global command. | 
|  | All lines of a multi-line list except the last line must end with | 
|  | .LR \e . | 
|  | The | 
|  | .RB \&` \&. \&' | 
|  | terminating input mode for an | 
|  | .LR a , | 
|  | .LR i , | 
|  | .L c | 
|  | command may be omitted if it would be on the | 
|  | last line of the command list. | 
|  | The commands | 
|  | .L g | 
|  | and | 
|  | .L v | 
|  | are not permitted in the command list. | 
|  | Any character other than space or newline may | 
|  | be used instead of | 
|  | .L / | 
|  | to delimit the regular expression. | 
|  | The second and third forms mean | 
|  | .BI g/ regular\ expression /p \f1. | 
|  | .TP | 
|  | .RB (\| .\| ) \|i | 
|  | .PD 0 | 
|  | .TP | 
|  | <text> | 
|  | .TP | 
|  | .B . | 
|  | Insert the given text before the addressed line. | 
|  | Dot is left at the last line input, or, if there were none, | 
|  | at the line before the addressed line. | 
|  | This command differs from the | 
|  | .I a | 
|  | command only in the placement of the | 
|  | text. | 
|  | .PD | 
|  | .TP | 
|  | .RB (\| .,.+1 \|) \|j | 
|  | Join the addressed lines into a single line; | 
|  | intermediate newlines are deleted. | 
|  | Dot is left at the resulting line. | 
|  | .TP | 
|  | .RB (\|\fL.\fP\|) \|k\fIx\fP | 
|  | Mark the addressed line with name | 
|  | .IR x , | 
|  | which must be a lower-case letter. | 
|  | The address form | 
|  | .BI \' x | 
|  | then addresses this line. | 
|  | .ne 2.5 | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|l | 
|  | List. | 
|  | Print the addressed lines in an unambiguous way: | 
|  | a tab is printed as | 
|  | .LR \et , | 
|  | a backspace as | 
|  | .LR \eb , | 
|  | backslashes as | 
|  | .LR \e\e , | 
|  | and non-printing characters as | 
|  | a backslash, an | 
|  | .LR x , | 
|  | and four hexadecimal digits. | 
|  | Long lines are folded, | 
|  | with the second and subsequent sub-lines indented one tab stop. | 
|  | If the last character in the line is a blank, | 
|  | it is followed by | 
|  | .LR \en . | 
|  | An | 
|  | .L l | 
|  | may be appended, like | 
|  | .LR p , | 
|  | to any non-I/O command. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|m\fIa | 
|  | Move. | 
|  | Reposition the addressed lines after the line | 
|  | addressed by | 
|  | .IR a . | 
|  | Dot is left at the last moved line. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|n | 
|  | Number. | 
|  | Perform | 
|  | .LR p , | 
|  | prefixing each line with its line number and a tab. | 
|  | An | 
|  | .L n | 
|  | may be appended, like | 
|  | .LR p , | 
|  | to any non-I/O command. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|p | 
|  | Print the addressed lines. | 
|  | Dot is left at the last line printed. | 
|  | A | 
|  | .L p | 
|  | appended to any non-I/O command causes the then current line | 
|  | to be printed after the command is executed. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|P | 
|  | This command is a synonym for | 
|  | .LR p . | 
|  | .TP | 
|  | .B q | 
|  | Quit the editor. | 
|  | No automatic write | 
|  | of a file is done. | 
|  | A | 
|  | .L q | 
|  | or | 
|  | .L e | 
|  | command is considered to be in error if the buffer has | 
|  | been modified since the last | 
|  | .LR w , | 
|  | .LR q , | 
|  | or | 
|  | .L e | 
|  | command. | 
|  | .TP | 
|  | .B Q | 
|  | Quit unconditionally. | 
|  | .TP | 
|  | .RB ( $ )\|r\ \fIfilename\fP | 
|  | Read in the given file after the addressed line. | 
|  | If no | 
|  | .I filename | 
|  | is given, the remembered file name is used. | 
|  | The file name is remembered if there were no | 
|  | remembered file name already. | 
|  | If the read is successful, the number of characters | 
|  | read is printed. | 
|  | Dot is left at the last line read from the file. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP/ | 
|  | .PD 0 | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP/g | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|s\fIn\fP/\fIregular\ expression\fP/\fIreplacement\fP | 
|  | .PD | 
|  | Substitute. | 
|  | Search each addressed | 
|  | line for an occurrence of the specified regular expression. | 
|  | On each line in which | 
|  | .I n | 
|  | matches are found | 
|  | .RI ( n | 
|  | defaults to 1 if missing), | 
|  | the | 
|  | .IR n th | 
|  | matched string is replaced by the replacement specified. | 
|  | If the global replacement indicator | 
|  | .L g | 
|  | appears after the command, | 
|  | all subsequent matches on the line are also replaced. | 
|  | It is an error for the substitution to fail on all addressed lines. | 
|  | Any character other than space or newline | 
|  | may be used instead of | 
|  | .L / | 
|  | to delimit the regular expression | 
|  | and the replacement. | 
|  | Dot is left at the last line substituted. | 
|  | The third form means | 
|  | .BI s n / regular\ expression / replacement\fP/p\f1. | 
|  | The second | 
|  | .L / | 
|  | may be omitted if the replacement is | 
|  | empty. | 
|  | .IP | 
|  | An ampersand | 
|  | .L & | 
|  | appearing in the replacement | 
|  | is replaced by the string matching the regular expression. | 
|  | The characters | 
|  | .BI \e n\f1, | 
|  | where | 
|  | .I n | 
|  | is a digit, | 
|  | are replaced by the text matched by the | 
|  | .IR n -th | 
|  | regular subexpression | 
|  | enclosed between | 
|  | .L ( | 
|  | and | 
|  | .LR ) . | 
|  | When | 
|  | nested parenthesized subexpressions | 
|  | are present, | 
|  | .I n | 
|  | is determined by counting occurrences of | 
|  | .L ( | 
|  | starting from the left. | 
|  | .IP | 
|  | A literal | 
|  | .LR & , | 
|  | .LR / , | 
|  | .L \e | 
|  | or newline may be included in a replacement | 
|  | by prefixing it with | 
|  | .LR \e . | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|t\|\fIa | 
|  | Transfer. | 
|  | Copy the addressed lines | 
|  | after the line addressed by | 
|  | .IR a . | 
|  | Dot is left at the last line of the copy. | 
|  | .TP | 
|  | .RB (\|\fL.,.\fP\|) \|u | 
|  | Undo. | 
|  | Restore the preceding contents | 
|  | of the first addressed line (sic), which must be the last line | 
|  | in which a substitution was made (double sic). | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|v/\fIregular\ expression\fP/\fIcommand\ list\fP | 
|  | This command is the same as the global command | 
|  | .L g | 
|  | except that the command list is executed with | 
|  | dot initially set to every line | 
|  | .I except | 
|  | those | 
|  | matching the regular expression. | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|w " \fIfilename\fP" | 
|  | Write the addressed lines to | 
|  | the given file. | 
|  | If the file does not exist, | 
|  | it is created with mode 666 (readable and writable by everyone). | 
|  | If no | 
|  | .I filename | 
|  | is given, the remembered file name, if any, is used. | 
|  | The file name is remembered if there were no | 
|  | remembered file name already. | 
|  | Dot is unchanged. | 
|  | If the write is successful, the number of characters written is | 
|  | printed. | 
|  | .TP | 
|  | .RB (\|\fL1,$\fP\|) \|W " \fIfilename\fP" | 
|  | Perform | 
|  | .LR w , | 
|  | but append to, instead of overwriting, any existing file contents. | 
|  | .TP | 
|  | .RB ( $ ) \|= | 
|  | Print the line number of the addressed line. | 
|  | Dot is unchanged. | 
|  | .TP | 
|  | .BI ! shell\ command | 
|  | Send the remainder of the line after the | 
|  | .L ! | 
|  | to | 
|  | .IR rc (1) | 
|  | to be interpreted as a command. | 
|  | Dot is unchanged. | 
|  | .TP | 
|  | .RB (\| .+1 )\|<newline> | 
|  | An address without a command is taken as a | 
|  | .L p | 
|  | command. | 
|  | A terminal | 
|  | .L / | 
|  | may be omitted from the address. | 
|  | A blank line alone is equivalent to | 
|  | .LR .+1p ; | 
|  | it is useful | 
|  | for stepping through text. | 
|  | .PP | 
|  | If an interrupt signal | 
|  | .SM (DEL) | 
|  | is sent, | 
|  | .I ed | 
|  | prints a | 
|  | .L ? | 
|  | and returns to its command level. | 
|  | .PP | 
|  | When reading a file, | 
|  | .I ed | 
|  | discards | 
|  | .SM NUL | 
|  | characters | 
|  | and all characters after the last newline. | 
|  | .SH FILES | 
|  | .B /tmp/e* | 
|  | .br | 
|  | .B ed.hup | 
|  | \ \ work is saved here if terminal hangs up | 
|  | .SH SOURCE | 
|  | .B \*9/src/cmd/ed.c | 
|  | .SH "SEE ALSO" | 
|  | .IR sam (1), | 
|  | .IR sed (1), | 
|  | .IR regexp (7) | 
|  | .SH DIAGNOSTICS | 
|  | .BI ? name | 
|  | for inaccessible file; | 
|  | .L ?TMP | 
|  | for temporary file overflow; | 
|  | .L ? | 
|  | for errors in commands or other overflows. |