﻿.---------------------------------------------------------------------.
|                                                                     |
|                      The Original UNIX Text Editor                  |
|                             Ed Cheat Sheet                          |
|                                                                     |
'---------------------------------------------------------------------'
| Peteris Krumins (peter@catonmat.net), 2007.08.22                    |
| http://www.catonmat.net  -  good coders code, great reuse           |
'---------------------------------------------------------------------'

 ====================== Line Addressing Summary ======================

.----------------.----------------------------------------------------.
|                |                                                    |
| Address Symbol | Description                                        |
|                |                                                    |
'----------------+----------------------------------------------------'
| .              | The current line (address) in the buffer.          |
'----------------+----------------------------------------------------'
| $              | The last line in the buffer.                       |
'----------------+----------------------------------------------------'
| n              | The nth, line in the buffer where n is a number    |
|                | in the range [0,$].                                |
'----------------+----------------------------------------------------'
| $              | The last line in the buffer.                       |
'----------------+----------------------------------------------------'
| -              | The previous line. This is equivalent to -1 and    |
| ^              | may be repeated with cumulative effect.            |
'----------------+----------------------------------------------------'
| -n             | The nth previous line, where n is a non-negative   |
| ^n             | number.                                            |
'----------------+----------------------------------------------------'
| +              | The next line. This is equivalent to +1 and may    |
|                | be repeated with cumulative effect.                |
'----------------+----------------------------------------------------'
| +n             | The nth next line, where n is a non-negative       |
| whitespace n   | number.                                            |
|                | Whitespace followed by a number n is interpreted   |
|                | as +n.                                             |
'----------------+----------------------------------------------------'
| ,              | The first through last lines in the buffer.        |
| %              | This is equivalent to the address range 1,$.       |
'----------------+----------------------------------------------------'
| ;              | The current through last lines in the buffer.      |
|                | This is equivalent to the address range .,$.       |
'----------------+----------------------------------------------------'
| /re/           | The next line containing the regular               |
|                | expression re.                                     |
|                | The search wraps to the beginning of the buffer    |
|                | and continues down to the current line, if         |
|                | necessary.                                         |
|                | // repeats the last search.                        |
'----------------+----------------------------------------------------'
| ?re?           | The previous line containing the regular           |
|                | expression re.                                     |
|                | The search wraps to the end of the buffer and      |
|                | continues up to the current line, if necessary.    |
|                | ?? repeats the last search.                        |
'----------------+----------------------------------------------------'
| 'lc            | The line previously marked by a `k' (mark)         |
|                | command, where lc is a lower case letter.          |
'----------------'----------------------------------------------------'

Each address in a comma-delimited range is interpreted relative
to the current address.
In a semicolon-delimited range, the 1st address is used to set
the current address, and the 2nd address is interpreted
relative to the first.


 ========================== Command Summary ==========================

.-------------------------.-------------------------------------------.
|                         |                                           |
| Command                 | Description                               |
|                         |                                           |
'-------------------------+-------------------------------------------'
| (.)a                    | Appends text to the buffer after the      |
|                         | addressed line, which may be theaddress   |
|                         | 0 (zero). Text is entered in input mode.  |
|                         | The current address is set to last line   |
|                         | entered.                                  |
'-------------------------+-------------------------------------------'
| (.,.)c                  | Changes lines in the buffer. The          |
|                         | addressed lines are deleted from the      |
|                         | buffer, and text is appended in their     |
|                         | place.                                    |
|                         | Text is entered in input mode. The        |
|                         | current address is set to last line       |
|                         | entered.                                  |
'-------------------------+-------------------------------------------'
| (.,.)d                  | Deletes the addressed lines from the      |
|                         | buffer. If there is a line after the      |
|                         | deleted range, then the current address   |
|                         | is set to this line. Otherwise the        |
|                         | current address is set to the line before |
|                         | the deleted range.                        |
'-------------------------+-------------------------------------------'
| e file                  | Edits file, and sets the default          |
|                         | filename. If file is not specified, then  |
|                         | the default filename is used. Any lines   |
|                         | in the buffer are deleted before the new  |
|                         | file is read.  The current address is set |
|                         | to the last line read.                    |
'-------------------------+-------------------------------------------'
| e !command              | Edits the standard output of  `!command', |
|                         | (see !command below). The default         |
|                         | filename is unchanged. Any lines in the   |
|                         | buffer are deleted before the output of   |
|                         | command is read. The current address is   |
|                         | set to the last line read.                |
'-------------------------+-------------------------------------------'
| E file                  | Edits file unconditionally. This is       |
|                         | similar to the e command, except that     |
|                         | unwritten changes are discarded without   |
|                         | warning. The current address is set to    |
|                         | the last line read.                       |
'-------------------------+-------------------------------------------'
| f file                  | Sets the default filename to file. If     |
|                         | file is not specified, then the default   |
|                         | unescaped filename is printed.            |
'-------------------------+-------------------------------------------'
| (1,$)g/re/command-list  | Applies command-list to each of the       |
|                         | addressed lines matching a regular        |
|                         | expression re. The current address is set |
|                         | to the line currently matched before      |
|                         | command-list is executed. At the end of   |
|                         | the `g' command, the current address is   |
|                         | set to the last line affected by          |
|                         | command-list.                             |
|                         |                                           |
|                         | Each command in command-list must be on a |
|                         | separate line, and every line except for  |
|                         | the last must be terminated by a          |
|                         | back­slash (\). Any commands are allowed, |
|                         | except for `g', `G', `v', and `V'.        |
|                         | A newline alone in command-list is        |
|                         | equivalent to a `p' command.              |
'-------------------------+-------------------------------------------'
| (1,$)G/re/              | Interactively edits the addressed lines   |
|                         | matching a regular expression re. For     |
|                         | each matching line, the line is printed,  |
|                         | the current address is set, and the user  |
|                         | is prompted to enter a command-list.      |
|                         | At the end of the `G' command, the        |
|                         | current address is set to the last line   |
|                         | affected by (the last) command-list.      |
|                         |                                           |
|                         | The format of command-list is the same as |
|                         | that of the `g' command. A newline alone  |
|                         | acts as a null command list. A single `&' |
|                         | repeats the last non-null command list.   |
'-------------------------+-------------------------------------------'
| H                       | Toggles the printing of error             |
|                         | explanations. By default, explanations    |
|                         | are not printed. It is recommended that   |
|                         | ed scripts begin with this command to aid |
|                         | in debugging.                             |
'-------------------------+-------------------------------------------'
| h                       | Prints an explanation of the last error.  |
'-------------------------+-------------------------------------------'
| (.)i                    | Inserts text in the buffer before the     |
|                         | current line. Text is entered in input    |
|                         | mode. The current address is set to the   |
|                         | last line entered.                        |
'-------------------------+-------------------------------------------'
| (.,.+1)j                | Joins the addressed lines. The addressed  |
|                         | lines are deleted from the buffer and     |
|                         | replaced by a single line containing      |
|                         | their joined text. The current address is |
|                         | set to the resultant line.                |
'-------------------------+-------------------------------------------'
| (.)klc                  | Marks a line with a lower case letter lc. |
|                         | The line can then be addressed as 'lc     |
|                         | (i.e., a single quote followed by lc) in  |
|                         | subsequent commands. The mark is not      |
|                         | cleared until the line is deleted or      |
|                         | otherwise modified.                       |
'-------------------------+-------------------------------------------'
| (.,.)l                  | Prints the addressed lines unambiguously. |
|                         | If invoked from a terminal, ed pauses at  |
|                         | the end of each page until a newline is   |
|                         | entered. The current address is set to    |
|                         | the last line printed.                    |
'-------------------------+-------------------------------------------'
| (.,.)m(.)               | Moves lines in the buffer. The addressed  |
|                         | lines are moved to after the right-hand   |
|                         | destination address, which may be the     |
|                         | address 0 (zero). The current address is  |
|                         | set to the last line moved.               |
'-------------------------+-------------------------------------------'
| (.,.)n                  | Prints the addressed lines along with     |
|                         | their line nums. The curr. addr is set to |
|                         | the last line printed                     |
'-------------------------+-------------------------------------------'
| (.,.)p                  | Prints the addressed lines. If invoked    |
|                         | from a terminal, ed pauses at the end of  |
|                         | each page until a newline is entered.     |
|                         | The current address is set to the last    |
|                         | line printed.                             |
'-------------------------+-------------------------------------------'
| P                       | Toggles the command prompt on and off.    |
|                         | Unless a prompt was specified by with     |
|                         | command-line option -p string, the        |
|                         | command prompt is by default turned off.  |
'-------------------------+-------------------------------------------'
| q                       | Quits ed.                                 |
'-------------------------+-------------------------------------------'
| Q                       | Quits ed unconditionally. This is similar |
|                         | to the q command, except that unwritten   |
|                         | changes are discarded without warning.    |
'-------------------------+-------------------------------------------'
| ($)r file               | Reads file to after the addressed line.   |
|                         | If file is not specified, then the        |
|                         | default filename is used. If there was no |
|                         | default filename prior to the command,    |
|                         | then the default filename is set to file. |
|                         | Otherwise, the default filename is        |
|                         | unchanged. The current address is set to  |
|                         | the last line read.                       |
'-------------------------+-------------------------------------------'
| ($)r !command           | Reads to after the addressed line the     |
|                         | standard output of `!command',            |
|                         | (see the !command below). The default     |
|                         | filename is unchanged. The current        |
|                         | address is set to the last line read.     |
'-------------------------+-------------------------------------------'
| (.,.)s/re/replacement/  | Replaces text in the addressed lines      |
| (.,.)s/re/replacement/g | matching a regular expression re with     |
| (.,.)s/re/replacement/n | replacement. By default, only the first   |
|                         | match in each line is replaced.           |
|                         | If the `g' (global) suffix is given, then |
|                         | every match to be replaced.               |
|                         | The `n' suffix, where n is a positive     |
|                         | number, causes only the n-th match to be  |
|                         | replaced. It is an error if no            |
|                         | substitutions are performed on any        |
|                         | of the addressed lines. The current       |
|                         | address is set the last line affected.    |
|                         |                                           |
|                         | re and replacement may be delimited by    |
|                         | any character other than space and        |
|                         | newline (see the `s' command below).      |
|                         | If one or two of the last delimiters is   |
|                         | omitted, then the last line affected is   |
|                         | printed as though the print suffix `p'    |
|                         | were specified.                           |
|                         |                                           |
|                         | An unescaped `&' in replacement is        |
|                         | replaced by the currently matched text.   |
|                         | The character sequence `\m', where m is a |
|                         | number in the range [1,9], is replaced by |
|                         | the m-th backreference expression of the  |
|                         | matched text. If replacement consists of  |
|                         | a single `%', then replacement from the   |
|                         | last substitution is used. Newlines may   |
|                         | be embedded in replacement if they are    |
|                         | escaped with a backslash (\).             |
'-------------------------+-------------------------------------------'
| (.,.)s                  | Repeats the last substitution. This form  |
|                         | of the `s' command accepts a count suffix |
|                         | `n', or any combination of the characters |
|                         | `r', `g', and `p'.                        |
|                         | If a count suffix `n' is given, then only |
|                         | the n-th match is replaced.               |
|                         | The `r' suffix causes the regular         |
|                         | expression of the last search to be used  |
|                         | instead of that of the last substitution. |
|                         | The `g' suffix toggles the global suffix  |
|                         | of the last substitution.                 |
|                         | The `p' suffix toggles the print suffix   |
|                         | of the last substitution. The current     |
|                         | address is set to the last line affected. |
'-------------------------+-------------------------------------------'
| (.,.)t(.)               | Copies (i.e., transfers) the addressed    |
|                         | lines to after the right-hand destination |
|                         | address, which may be the address         |
|                         | 0 (zero). The current address is set to   |
|                         | the last line copied.                     |
'-------------------------+-------------------------------------------'
| u                       | Undoes the last command and restores the  |
|                         | current address to what it was before the |
|                         | command.  The global commands `g', `G',   |
|                         | `v', and `V' are treated as a single      |
|                         | command by undo. `u' is its own inverse.  |
'-------------------------+-------------------------------------------'
| (1,$)v/re/command-list  | Applies command-list to each of the       |
|                         | addressed lines not matching a regular    |
|                         | expression re. This is similar to the     |
|                         | `g' command.                              |
'-------------------------+-------------------------------------------'
| (1,$)V/re/              | Interactively edits the addressed lines   |
|                         | not matching a regular expression re.     |
|                         | This is similar to the `G' command.       |
'-------------------------+-------------------------------------------'
| (1,$)w file             | Writes the addressed lines to file. Any   |
|                         | previous contents of file is lost without |
|                         | warning. If there is no default filename, |
|                         | then the default filename is set to file, |
|                         | otherwise it is unchanged. If no filename |
|                         | is specified, then the default filename   |
|                         | is used. The current address is unchanged.|
'-------------------------+-------------------------------------------'
| (1,$)wq file            | Writes the addressed lines to file, and   |
|                         | then executes a `q' command.              |
'-------------------------+-------------------------------------------'
| (1,$)w !command         | Writes the addressed lines to the         |
|                         | standard input of `!command', (see the    |
|                         | !command below).                          |
|                         | The defaultfilename and current address   |
|                         | are unchanged.                            |
'-------------------------+-------------------------------------------'
| (1,$)W file             | Appends the addressed lines to the end of |
|                         | file. This is similar to the `w' command, |
|                         | expect that the previous contents of file |
|                         | is not clobbered. The current address is  |
|                         | unchanged.                                |
'-------------------------+-------------------------------------------'
| (.)x                    | Copies (puts) the contents of the cut     |
|                         | buffer to after the addressed line.       |
|                         | The current address is set to the last    |
|                         | line copied.                              |
'-------------------------+-------------------------------------------'
| (.,.)y                  | Copies (yanks) the addressed lines to the |
|                         | cut buffer. The cut buffer is overwritten |
|                         | by subsequent `y', `s', `j', `d', or `c'  |
|                         | commands. The current address is          |
|                         | unchanged.                                |
'-------------------------+-------------------------------------------'
| (.+1)zn                 | Scrolls n lines at a time starting at     |
|                         | addressed line. If n is not specified,    |
|                         | then the current window size is used.     |
|                         | The current address is set to the last    |
|                         | line printed.                             |
'-------------------------+-------------------------------------------'
| !command                | Executes command via sh(1). If the first  |
|                         | character of command is `!', then it is   |
|                         | replaced by text of the previous          |
|                         | `!command'. ed does not process command   |
|                         | for backslash (\) escapes. However, an    |
|                         | unescaped `%' is replaced by the default  |
|                         | filename. When the shell returns from     |
|                         | execution, a `!' is printed to the        |
|                         | standard output. The current line is      |
|                         | unchanged.                                |
'-------------------------+-------------------------------------------'
| (.,.)#                  | Begins a comment; the rest of the line,   |
|                         | up to a newline, is ignored. If a line    |
|                         | address followed by a semicolon is given, |
|                         | then the current address is set to that   |
|                         | address. Otherwise, the current address   |
|                         | is unchanged.                             |
'-------------------------+-------------------------------------------'
| ($)=                    | Prints the line number of the addressed   |
|                         | line.                                     |
'-------------------------+-------------------------------------------'
| (.+1)newline            | Prints the addressed line, and sets the   |
|                         | current address to that line.             |
'-------------------------'-------------------------------------------'

 =====================================================================

.---------------------------------------------------------------------.
| Peteris Krumins (peter@catonmat.net), 2007.08.22                    |
| http://www.catonmat.net  -  good coders code, great reuse           |
'---------------------------------------------------------------------'

