diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/ed.1 | 1045 | ||||
-rw-r--r-- | doc/ed.info | 1417 | ||||
-rw-r--r-- | doc/ed.texinfo | 982 | ||||
-rw-r--r-- | doc/fdl.texinfo | 506 |
4 files changed, 3950 insertions, 0 deletions
diff --git a/doc/ed.1 b/doc/ed.1 new file mode 100644 index 0000000..4a3e81e --- /dev/null +++ b/doc/ed.1 @@ -0,0 +1,1045 @@ +.TH ED 1 "13 June 2009" +.SH NAME +ed, red \- text editor +.SH SYNOPSIS +ed [-GVhs] [-p \fIstring\fR] [\fIfile\fR] +.LP +red [-GVhs] [-p \fIstring\fR] [\fIfile\fR] +.SH DESCRIPTION +.B ed +is a line-oriented text editor. +It is used to create, display, modify and otherwise manipulate text +files. +.B red +is a restricted +.BR ed : +it can only edit files in the current +directory and cannot execute shell commands. + +If invoked with a +.I file +argument, then a copy of +.I file +is read into the editor's buffer. +Changes are made to this copy and not directly to +.I file +itself. +Upon quitting +.BR ed , +any changes not explicitly saved with a +.I `w' +command are lost. + +Editing is done in two distinct modes: +.I command +and +.IR input . +When first invoked, +.B ed +is in command mode. +In this mode commands are read from the standard input and +executed to manipulate the contents of the editor buffer. +A typical command might look like: +.sp +.RS +,s/\fIold\fR/\fInew\fR/g +.RE +.sp +which replaces all occurrences of the string +.I old +with +.IR new . + +When an input command, such as +.I `a' +(append), +.I `i' +(insert) or +.I `c' +(change), is given, +.B ed +enters input mode. This is the primary means +of adding text to a file. +In this mode, no commands are available; +instead, the standard input is written +directly to the editor buffer. Lines consist of text up to and +including a +.IR newline +character. +Input mode is terminated by +entering a single period (\fI.\fR) on a line. + +All +.B ed +commands operate on whole lines or ranges of lines; e.g., +the +.I `d' +command deletes lines; the +.I `m' +command moves lines, and so on. +It is possible to modify only a portion of a line by means of replacement, +as in the example above. However even here, the +.I `s' +command is applied to whole lines at a time. + +In general, +.B ed +commands consist of zero or more line addresses, followed by a single +character command and possibly additional parameters; i.e., +commands have the structure: +.sp +.RS +.I [address [,address]]command[parameters] +.RE +.sp +The address(es) indicate the line or range of lines to be affected by the +command. If fewer addresses are given than the command accepts, then +default addresses are supplied. + +.SS OPTIONS +.TP 8 +-G +Forces backwards compatibility. Affects the commands +.IR `G' , +.IR `V' , +.IR `f' , +.IR `l' , +.IR `m' , +.IR `t' , +and +.IR `!!' . +.TP 8 +-s +Suppresses diagnostics. This should be used if +.BR ed 's +standard input is from a script. + +.TP 8 +.RI \-p \ string +Specifies a command prompt. This may be toggled on and off with the +.I `P' +command. + +.TP 8 +.I file +Specifies the name of a file to read. If +.I file +is prefixed with a +bang (!), then it is interpreted as a shell command. In this case, +what is read is +the standard output of +.I file +executed via +.IR sh (1). +To read a file whose name begins with a bang, prefix the +name with a backslash (\e). +The default filename is set to +.I file +only if it is not prefixed with a bang. + +.SS LINE ADDRESSING +An address represents the number of a line in the buffer. +.B ed +maintains a +.I current address +which is +typically supplied to commands as the default address when none is specified. +When a file is first read, the current address is set to the last line +of the file. In general, the current address is set to the last line +affected by a command. + +A line address is +constructed from one of the bases in the list below, optionally followed +by a numeric offset. The offset may include any combination +of digits, operators (i.e. +.IR + +and +.IR - ) +and whitespace. +Addresses are read from left to right, and their values are computed +relative to the current address. + +One exception to the rule that addresses represent line numbers is the +address +.I 0 +(zero). +This means "before the first line," +and is legal wherever it makes sense. + +An address range is two addresses separated either by a comma or +semicolon. The value of the first address in a range cannot exceed the +value of the second. If only one address is given in a range, then +the second address is set to the given address. If an +.IR n- tuple +of addresses is given where +.I n > 2, +then the corresponding range is determined by the last two addresses in +the +.IR n- tuple. +If only one address is expected, then the last address is used. + +Each address in a comma-delimited range is interpreted relative to the +current address. In a semicolon-delimited range, the first address is +used to set the current address, and the second address is interpreted +relative to the first. + + +The following address symbols are recognized. + +.TP 8 +\&. +The current line (address) in the buffer. + +.TP 8 +$ +The last line in the buffer. + +.TP 8 +.I n +The +.IR n th, +line in the buffer +where +.I n +is a number in the range +.IR [0,$] . + +.TP 8 +- +The previous line. +This is equivalent to +.I -1 +and may be repeated with cumulative effect. + +.TP 8 +^\fIn\fR +The +.IR n th +previous line, where +.I n +is a non-negative number. + +.TP 8 ++ +The +next line. +This is equivalent to +.I +1 +and may be repeated with cumulative effect. + +.HP +.I whitespace n +.TP 8 ++\fIn\fR +The +.IR n th +next line, where +.I n +is a non-negative number. +.I Whitespace +followed by a number +.I n +is interpreted as +.IR +n . + +.TP 8 +, +The first through last lines in the buffer. This is equivalent to +the address range +.IR 1,$ . + +.TP 8 +; +The current through last lines in the buffer. This is equivalent to +the address range +.IR .,$ . + +.TP 8 +.RI / re / +The +next line containing the regular expression +.IR re . +The search wraps to the beginning of the buffer and continues down to the +current line, if necessary. +// repeats the last search. + +.TP 8 +.RI ? re ? +The +previous line containing the regular expression +.IR re . +The search wraps to the end of the buffer and continues up to the +current line, if necessary. +?? repeats the last search. + +.TP 8 +.RI ' lc +The +line previously marked by a +.I `k' +(mark) command, where +.I lc +is a lower case letter. + +.SS REGULAR EXPRESSIONS +Regular expressions are patterns used in selecting text. +For example, the +.B ed +command +.sp +.RS +g/\fIstring\fR/ +.RE +.sp +prints all lines containing +.IR string . +Regular expressions are also +used by the +.I `s' +command for selecting old text to be replaced with new. + +In addition to a specifying string literals, regular expressions can +represent +classes of strings. Strings thus represented are said to be matched +by the corresponding regular expression. +If it is possible for a regular expression +to match several strings in a line, then the left-most longest match is +the one selected. + +The following symbols are used in constructing regular expressions: + +.TP 8 +c +Any character +.I c +not listed below, including `{', '}', `(', `)', `<' and `>', +matches itself. + +.TP 8 +\e\fIc\fR +A backslash-escaped character +.IR c +other than `{', '}', `(', `)', `<', `>', +`b', 'B', `w', `W', `+', and `?' +matches itself. + +.TP 8 +\&. +Matches any single character. + +.TP 8 +.I [char-class] +Matches any single character in +.IR char-class . +To include a `]' +in +.IR char-class , +it must be the first character. +A range of characters may be specified by separating the end characters +of the range with a `-', e.g., `a-z' specifies the lower case characters. +The following literal expressions can also be used in +.I char-class +to specify sets of characters: +.sp +.nf +\ \ [:alnum:]\ \ [:cntrl:]\ \ [:lower:]\ \ [:space:] +.PD 0 +\ \ [:alpha:]\ \ [:digit:]\ \ [:print:]\ \ [:upper:] +.PD 0 +\ \ [:blank:]\ \ [:graph:]\ \ [:punct:]\ \ [:xdigit:] +.fi +.sp +If `-' appears as the first or last +character of +.IR char-class , +then it matches itself. +All other characters in +.I char-class +match themselves. +.sp +Patterns in +.I char-class +of the form: +.sp +\ \ [.\fIcol-elm\fR.] or, +.PD 0 +\ \ [=\fIcol-elm\fR=] +.sp +where +.I col-elm +is a +.I collating element +are interpreted according to +.IR locale (5) +(not currently supported). +See +.IR regex (3) +for an explanation of these constructs. + +.TP 8 +[^\fIchar-class\fR] +Matches any single character, other than newline, not in +.IR char-class . +.IR char-class +is defined +as above. + +.TP 8 +^ +If `^' is the first character of a regular expression, then it +anchors the regular expression to the beginning of a line. +Otherwise, it matches itself. + +.TP 8 +$ +If `$' is the last character of a regular expression, it +anchors the regular expression to the end of a line. +Otherwise, it matches itself. + +.TP 8 +\e(\fIre\fR\e) +Defines a (possibly null) subexpression +.IR re . +Subexpressions may be nested. +A subsequent backreference of the form `\e\fIn\fR', where +.I n +is a number in the range [1,9], expands to the text matched by the +.IR n th +subexpression. +For example, the regular expression `\e(a.c\e)\e1' matches the +string `abcabc', but not `abcadc'. +Subexpressions are ordered relative to +their left delimiter. + +.TP 8 +* +Matches the single character regular expression or subexpression +immediately preceding it zero or more times. If '*' is the first +character of a regular expression or subexpression, then it matches +itself. The `*' operator sometimes yields unexpected results. +For example, the regular expression `b*' matches the beginning of +the string `abbb', as opposed to the substring `bbb', since a null match +is the only left-most match. + +.HP +\fR\e{\fIn,m\fR\e}\fR +.HP +\fR\e{\fIn,\fR\e}\fR +.TP 8 +\fR\e{\fIn\fR\e}\fR +Matches the single character regular expression or subexpression +immediately preceding it at least +.I n +and at most +.I m +times. +If +.I m +is omitted, then it matches at least +.I n +times. +If the comma is also omitted, then it matches exactly +.I n +times. If any of these forms occurs first in a regular expression or +subexpression, then it is interpreted literally (i.e., the regular +expression `\e{2\e}' matches the string `{2}', and so on). + +.HP +\e< +.TP 8 +\fR\e>\fR +Anchors the single character regular expression or subexpression +immediately following it to the beginning (\e<) or ending +(\e>) of a \fIword\fR, i.e., in ASCII, a maximal string of alphanumeric +characters, including the underscore (_). + + +.LP +The following extended operators are preceded by a backslash (\e) to +distinguish them from traditional +.B ed +syntax. + +.HP +\fR\e\`\fR +.TP 8 +\fR\e\'\fR +Unconditionally matches the beginning (\e\`) or ending (\e\') of a line. + +.TP 8 +\fR\e?\fR +Optionally matches the single character regular expression or subexpression +immediately preceding it. For example, the regular expression `a[bd]\e?c' +matches the strings `abc', `adc' and `ac'. If \e? occurs at the beginning +of a regular expressions or subexpression, then it matches a literal `?'. + +.TP 8 +\fR\e+\fR +Matches the single character regular expression or subexpression +immediately preceding it one or more times. So the regular expression +`a\e+' is shorthand for `aa*'. If \e+ occurs at the beginning of a +regular expression or subexpression, then it matches a literal `+'. + + +.TP 8 +\fR\eb\fR +Matches the beginning or ending (null string) of a word. Thus the regular +expression `\ebhello\eb' is equivalent to `\e<hello\e>'. However, `\eb\eb' +is a valid regular expression whereas `\e<\e>' is not. + +.TP 8 +\fR\eB\fR +Matches (a null string) inside a word. + +.TP 8 +\fR\ew\fR +Matches any character in a word. + +.TP 8 +\fR\eW\fR +Matches any character not in a word. + +.SS COMMANDS +All +.B ed +commands are single characters, though some require additional parameters. +If a command's parameters extend over several lines, then +each line except for the last +must be terminated with a backslash (\e). + +In general, at most one command is allowed per line. +However, most commands accept a print suffix, which is any of +.I `p' +(print), +.I `l' +(list) , +or +.I `n' +(enumerate), +to print the last line affected by the command. + +An interrupt (typically ^C) has the effect of aborting the current command +and returning the editor to command mode. + +.B ed +recognizes the following commands. The commands are shown together with +the default address or address range supplied if none is +specified (in parenthesis). + +.TP 8 +(.)a +Appends text to the buffer after the addressed line, which may be the +address 0 (zero). Text is entered in input mode. The current address is +set to last line entered. + +.TP 8 +(.,.)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. + +.TP 8 +(.,.)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. + +.TP 8 +.RI e \ file +Edits +.IR file , +and sets the default filename. +If +.I 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. + +.TP 8 +e !\fIcommand\fR +Edits the standard output of +.IR `!command' , +(see +.RI ! command +below). +The default filename is unchanged. +Any lines in the buffer are deleted before the output of +.I command +is read. +The current address is set to the last line read. + +.TP 8 +.RI E \ file +Edits +.I file +unconditionally. +This is similar to the +.I e +command, +except that unwritten changes are discarded without warning. +The current address is set to the last line read. + +.TP 8 +.RI f \ file +Sets the default filename to +.IR file . +If +.I file +is not specified, then the default unescaped filename is printed. + +.TP 8 +.RI (1,$)g /re/command-list +Applies +.I command-list +to each of the addressed lines matching a regular expression +.IR re . +The current address is set to the +line currently matched before +.I command-list +is executed. +At the end of the +.I `g' +command, the current address is set to the last line affected by +.IR command-list . + +Each command in +.I command-list +must be on a separate line, +and every line except for the last must be terminated by a backslash +(\e). +Any commands are allowed, except for +.IR `g' , +.IR `G' , +.IR `v' , +and +.IR `V' . +A newline alone in +.I command-list +is equivalent to a +.I `p' +command. + +.TP 8 +.RI (1,$)G /re/ +Interactively edits the addressed lines matching a regular expression +.IR re. +For each matching line, +the line is printed, +the current address is set, +and the user is prompted to enter a +.IR command-list . +At the end of the +.I `G' +command, the current address +is set to the last line affected by (the last) +.IR command-list . + +The format of +.I command-list +is the same as that of the +.I `g' +command. A newline alone acts as a null command list. +A single `&' repeats the last non-null command list. + +.TP 8 +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. + +.TP 8 +h +Prints an explanation of the last error. + +.TP 8 +(.)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. + +.TP 8 +(.,.+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. + +.TP 8 +.RI (.)k lc +Marks a line with a lower case letter +.IR lc . +The line can then be addressed as +.I 'lc +(i.e., a single quote followed by +.I lc +) in subsequent commands. The mark is not cleared until the line is +deleted or otherwise modified. + +.TP 8 +(.,.)l +Prints the addressed lines unambiguously. If invoked from a terminal, +.B ed +pauses at the end of each page until a newline is entered. +The current address is set to the last line printed. + +.TP 8 +(.,.)m(.) +Moves lines in the buffer. The addressed lines are moved to after the +right-hand destination address, which may be the address +.IR 0 +(zero). +The current address is set to the new address of the last line moved. + +.TP 8 +(.,.)n +Prints the addressed lines along with +their line numbers. The current address is set to the last line +printed. + +.TP 8 +(.,.)p +Prints the addressed lines. If invoked from a terminal, +.B ed +pauses at the end of each page until a newline is entered. +The current address is set to the last line +printed. + +.TP 8 +P +Toggles the command prompt on and off. +Unless a prompt was specified by with command-line option +\fI-p string\fR, the command prompt is by default turned off. + +.TP 8 +q +Quits ed. + +.TP 8 +Q +Quits ed unconditionally. +This is similar to the +.I q +command, +except that unwritten changes are discarded without warning. + +.TP 8 +.RI ($)r \ file +Reads +.I file +to after the addressed line. If +.I 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 +.IR file . +Otherwise, the default filename is unchanged. +The current address is set to the last line read. + +.TP 8 +($)r !\fIcommand\fR +Reads +to after the addressed line +the standard output of +.IR `!command' , +(see the +.RI ! command +below). +The default filename is unchanged. +The current address is set to the last line read. + +.HP +.RI (.,.)s /re/replacement/ +.HP +.RI (.,.)s /re/replacement/\fRg\fR +.HP +.RI (.,.)s /re/replacement/n +.br +Replaces text in the addressed lines +matching a regular expression +.I re +with +.IR replacement . +By default, only the first match in each line is replaced. +If the +.I `g' +(global) suffix is given, then every match to be replaced. +The +.I `n' +suffix, where +.I n +is a positive number, causes only the +.IR 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 to the last line affected. + +.I re +and +.I replacement +may be delimited by any character other than space, newline and the +characters used by the form of the +.I `s' +command shown below. +If one or two of the last delimiters is omitted, then the last line +affected is printed as though the print suffix +.I `p' +were specified. + + +An unescaped `&' in +.I replacement +is replaced by the currently matched text. +The character sequence +\fI`\em'\fR, +where +.I m +is a number in the range [1,9], is replaced by the +.IR m th +backreference expression of the matched text. +If +.I replacement +consists of a single `%', then +.I replacement +from the last substitution is used. +Newlines may be embedded in +.I replacement +if they are escaped with a backslash (\e). + +.TP 8 +(.,.)s +Repeats the last substitution. +This form of the +.I `s' +command accepts a count suffix +.IR `n' , +and any combination of the characters +.IR `r' , +.IR `g' , +and +.IR `p' . +If a count suffix +.I `n' +is given, then only the +.IR n th +match is replaced. +The +.I `r' +suffix causes +the regular expression of the last search to be used instead of the +that of the last substitution. +The +.I `g' +suffix toggles the global suffix of the last substitution. +The +.I `p' +suffix toggles the print suffix of the last substitution. +The current address is set to the last line affected. + +.TP 8 +(.,.)t(.) +Copies (i.e., transfers) the addressed lines to after the right-hand +destination address, which may be the address +.IR 0 +(zero). +The current address is set to the last line +copied. + +.TP 8 +u +Undoes the last command and restores the current address +to what it was before the command. +The global commands +.IR `g' , +.IR `G' , +.IR `v' , +and +.IR `V' . +are treated as a single command by undo. +.I `u' +is its own inverse. + +.TP 8 +.RI (1,$)v /re/command-list +Applies +.I command-list +to each of the addressed lines not matching a regular expression +.IR re . +This is similar to the +.I `g' +command. + +.TP 8 +.RI (1,$)V /re/ +Interactively edits the addressed lines not matching a regular expression +.IR re. +This is similar to the +.I `G' +command. + +.TP 8 +.RI (1,$)w \ file +Writes the addressed lines to +.IR file . +Any previous contents of +.I file +is lost without warning. +If there is no default filename, then the default filename is set to +.IR file, +otherwise it is unchanged. If no filename is specified, then the default +filename is used. +The current address is unchanged. + +.TP 8 +.RI (1,$)wq \ file +Writes the addressed lines to +.IR file , +and then executes a +.I `q' +command. + +.TP 8 +(1,$)w !\fIcommand\fR +Writes the addressed lines to the standard input of +.IR `!command' , +(see the +.RI ! command +below). +The default filename and current address are unchanged. + +.TP 8 +.RI (1,$)W \ file +Appends the addressed lines to the end of +.IR file . +This is similar to the +.I `w' +command, expect that the previous contents of file is not clobbered. +The current address is unchanged. + +.TP 8 +(.)x +Copies (puts) the contents of the cut buffer to after the addressed line. +The current address is set to the last line copied. + +.TP 8 +(.,.)y +Copies (yanks) the addressed lines to the cut buffer. +The cut buffer is overwritten by subsequent +.IR `y' , +.IR `s' , +.IR `j' , +.IR `d' , +or +.I `c' +commands. +The current address is unchanged. + +.TP 8 +.RI (.+1)z n +Scrolls +.I n +lines at a time starting at addressed line. If +.I n +is not specified, then the current window size is used. +The current address is set to the last line printed. + +.TP 8 +.RI ! command +Executes +.I command +via +.IR sh (1). +If the first character of +.I command +is `!', then it is replaced by text of the +previous +.IR `!command' . +.B ed +does not process +.I command +for backslash (\e) escapes. +However, an unescaped +.I `%' +is replaced by the default filename. +When the shell returns from execution, a `!' +is printed to the standard output. +The current line is unchanged. + +.TP 8 +(.,.)# +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. + +.TP 8 +($)= +Prints the line number of the addressed line. + +.TP 8 +(.+1)newline +Prints the addressed line, and sets the current address to +that line. + +.SH FILES +.TP 8 +ed.hup +The file to which +.B ed +attempts to write the buffer if the terminal hangs up. + +.SH SEE ALSO + +.IR vi (1), +.IR sed (1), +.IR regex (3), +.IR sh (1). + +USD:12-13 + +B. W. Kernighan and P. J. Plauger, +.I Software Tools in Pascal , +Addison-Wesley, 1981. + +.SH LIMITATIONS +.B ed +processes +.I file +arguments for backslash escapes, i.e., in a filename, +any characters preceded by a backslash (\e) are +interpreted literally. + +If a text (non-binary) file is not terminated by a newline character, +then +.B ed +appends one on reading/writing it. In the case of a binary file, +.B ed +does not append a newline on reading/writing. + +per line overhead: 4 ints + +.SH DIAGNOSTICS +When an error occurs, +if +.BR ed 's +input is from a regular file or here document, then it +exits, otherwise it +prints a `?' and returns to command mode. +An explanation of the last error can be +printed with the +.I `h' +(help) command. + +Attempting to quit +.B ed +or edit another file before writing a modified buffer +results in an error. +If the command is entered a second time, it succeeds, +but any changes to the buffer are lost. + +.B ed +exits with 0 if no errors occurred; otherwise >0. diff --git a/doc/ed.info b/doc/ed.info new file mode 100644 index 0000000..de0f728 --- /dev/null +++ b/doc/ed.info @@ -0,0 +1,1417 @@ +This is ed.info, produced by makeinfo version 4.13 from ed.texinfo. + +INFO-DIR-SECTION Basics +START-INFO-DIR-ENTRY +* Ed: (ed). The GNU line editor +END-INFO-DIR-ENTRY + + Copyright (C) 1993, 2006, 2007, 2008, 2009 Free Software Foundation, +Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + + +File: ed.info, Node: Top, Next: Overview, Up: (dir) + +The GNU ed line editor +********************** + +This manual is for GNU ed (version 1.4, 10 July 2009). + + + GNU ed is an 8-bit clean, more or less POSIX-compliant +implementation of the standard Unix line editor. These days, +full-screen editors have rendered `ed' mostly of historical interest. +Nonetheless, it appeals to a handful of aging programmers who still +believe that "Small is Beautiful". + +* Menu: + +* Overview:: Overview of the `ed' command +* Introduction to Line Editing:: Getting started with GNU `ed' +* Invoking Ed:: Command line interface +* Line Addressing:: Specifying lines/ranges in the buffer +* Regular Expressions:: Patterns for selecting text +* Commands:: Commands recognized by GNU `ed' +* Limitations:: Intrinsic limits of GNU `ed' +* Diagnostics:: GNU `ed' error handling +* Problems:: Reporting bugs +* GNU Free Documentation License:: How you can copy and share this manual + + + Copyright (C) 1993, 2006, 2007, 2008, 2009 Free Software Foundation, +Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + + +File: ed.info, Node: Overview, Next: Introduction to Line Editing, Prev: Top, Up: Top + +1 Overview +********** + +`ed' is a line-oriented text editor. It is used to create, display, +modify and otherwise manipulate text files. `red' is a restricted `ed': +it can only edit files in the current directory and cannot execute +shell commands. + + If invoked with a FILE argument, then a copy of FILE is read into +the editor's buffer. Changes are made to this copy and not directly to +FILE itself. Upon quitting `ed', any changes not explicitly saved with +a `w' command are lost. + + Editing is done in two distinct modes: "command" and "input". When +first invoked, `ed' is in command mode. In this mode commands are read +from the standard input and executed to manipulate the contents of the +editor buffer. A typical command might look like: + + ,s/OLD/NEW/g + + which replaces all occurences of the string OLD with NEW. + + When an input command, such as `a' (append), `i' (insert) or `c' +(change), is given, `ed' enters input mode. This is the primary means +of adding text to a file. In this mode, no commands are available; +instead, the standard input is written directly to the editor buffer. A +"line" consists of the text up to and including a <newline> character. +Input mode is terminated by entering a single period (`.') on a line. + + All `ed' commands operate on whole lines or ranges of lines; e.g., +the `d' command deletes lines; the `m' command moves lines, and so on. +It is possible to modify only a portion of a line by means of +replacement, as in the example above. However even here, the `s' +command is applied to whole lines at a time. + + In general, `ed' commands consist of zero or more line addresses, +followed by a single character command and possibly additional +parameters; i.e., commands have the structure: + + [ADDRESS [,ADDRESS]]COMMAND[PARAMETERS] + + The ADDRESSes indicate the line or range of lines to be affected by +the command. If fewer addresses are given than the command accepts, +then default addresses are supplied. + + +File: ed.info, Node: Introduction to Line Editing, Next: Invoking Ed, Prev: Overview, Up: Top + +2 Introduction to Line Editing +****************************** + +`ed' was created, along with the Unix operating system, by Ken Thompson +and Dennis Ritchie. It is the refinement of its more complex, +programmable predecessor, `QED', to which Thompson and Ritchie had +already added pattern matching capabilities (*note Regular +Expressions::). + + For the purposes of this tutorial, a working knowledge of the Unix +shell `sh' (*note Bash: (bash)Bash.) and the Unix file system is +recommended, since `ed' is designed to interact closely with them. + + The principal difference between line editors and display editors is +that display editors provide instant feedback to user commands, whereas +line editors require sometimes lengthy input before any effects are +seen. The advantage of instant feedback, of course, is that if a mistake +is made, it can be corrected immediately, before more damage is done. +Editing in `ed' requires more strategy and forethought; but if you are +up to the task, it can be quite efficient. + + Much of the `ed' command syntax is shared with other Unix utilities. + + As with the shell, <RETURN> (the carriage-return key) enters a line +of input. So when we speak of "entering" a command or some text in +`ed', <RETURN> is implied at the end of each line. Prior to typing +<RETURN>, corrections to the line may be made by typing either +<BACKSPACE> (sometimes labeled <DELETE> or <DEL>) to erase characters +backwards, or <CONTROL>-u (i.e., hold the CONTROL key and type u) to +erase the whole line. + + When `ed' first opens, it expects to be told what to do but doesn't +prompt us like the shell. So let's begin by telling `ed' to do so with +the <P> ("prompt") command: + + $ ed + P + * + + By default, `ed' uses asterisk (`*') as command prompt to avoid +confusion with the shell command prompt (`$'). + + We can run Unix shell (`sh') commands from inside `ed' by prefixing +them with <!> (exclamation mark, aka "bang"). For example: + + *!date + Mon Jun 26 10:08:41 PDT 2006 + ! + *!for s in hello world; do echo $s; done + hello + world + ! + * + + So far, this is no different from running commands in the Unix shell. +But let's say we want to edit the output of a command, or save it to a +file. First we must capture the command output to a temporary location +called a "buffer" where `ed' can access it. This is done with `ed''s +<r> command (mnemonic: "read"): + + *r !cal + 143 + * + + Here `ed' is telling us that it has just read 143 characters into +the editor buffer - i.e., the output of the `cal' command, which prints +a simple ASCII calendar. To display the buffer contents we issue the +<p> ("print") command (not to be confused with the prompt command, +which is uppercase!). To indicate the range of lines in the buffer that +should be printed, we prefix the command with <,> (comma) which is +shorthand for "the whole buffer": + + *,p + September 2006 + Mo Tu We Th Fr Sa Su + 1 2 3 + 4 5 6 7 8 9 10 + 11 12 13 14 15 16 17 + 18 19 20 21 22 23 24 + 25 26 27 28 29 30 + + * + + Now let's write the buffer contents to a file named `junk' with the +<w> ("write") command. Again, we use the <,> prefix to indicate that +it's the whole buffer we want: + + *,w junk + 143 + * + + Need we say? It's good practice to frequently write the buffer +contents, since unwritten changes to the buffer will be lost when we +exit `ed'. + + The sample sessions below illustrate some basic concepts of line +editing with `ed'. We begin by creating a file, `sonnet', with some +help from Shakespeare. As with the shell, all input to `ed' must be +followed by a <newline> character. Comments begin with a `#'. + + $ ed + # The `a' command is for appending text to the editor buffer. + a + No more be grieved at that which thou hast done. + Roses have thorns, and filvers foutians mud. + Clouds and eclipses stain both moon and sun, + And loathsome canker lives in sweetest bud. + . + # Entering a single period on a line returns `ed' to command mode. + # Now write the buffer to the file `sonnet' and quit: + w sonnet + 183 + # `ed' reports the number of characters written. + q + $ ls -l + total 2 + -rw-rw-r-- 1 alm 183 Nov 10 01:16 sonnet + $ + + In the next example, some typos are corrected in the file `sonnet'. + + $ ed sonnet + 183 + # Begin by printing the buffer to the terminal with the `p' command. + # The `,' means ``all lines.'' + ,p + No more be grieved at that which thou hast done. + Roses have thorns, and filvers foutians mud. + Clouds and eclipses stain both moon and sun, + And loathsome canker lives in sweetest bud. + # Select line 2 for editing. + 2 + Roses have thorns, and filvers foutians mud. + # Use the substitute command, `s', to replace `filvers' with `silver', + # and print the result. + s/filvers/silver/p + Roses have thorns, and silver foutians mud. + # And correct the spelling of `fountains'. + s/utia/untai/p + Roses have thorns, and silver fountains mud. + w sonnet + 183 + q + $ + + Since `ed' is line-oriented, we have to tell it which line, or range +of lines we want to edit. In the above example, we do this by +specifying the line's number, or sequence in the buffer. Alternatively, +we could have specified a unique string in the line, e.g., `/filvers/', +where the `/'s delimit the string in question. Subsequent commands +affect only the selected line, a.k.a. the "current" line. Portions of +that line are then replaced with the substitute command, whose syntax +is `s/OLD/NEW/'. + + Although `ed' accepts only one command per line, the print command +`p' is an exception, and may be appended to the end of most commands. + + In the next example, a title is added to our sonnet. + + $ ed sonnet + 183 + a + Sonnet #50 + . + ,p + No more be grieved at that which thou hast done. + Roses have thorns, and silver fountains mud. + Clouds and eclipses stain both moon and sun, + And loathsome canker lives in sweetest bud. + Sonnet #50 + # The title got appended to the end; we should have used `0a' + # to append ``before the first line.'' + # Move the title to its proper place. + 5m0p + Sonnet #50 + # The title is now the first line, and the current line has been + # set to this line as well. + ,p + Sonnet #50 + No more be grieved at that which thou hast done. + Roses have thorns, and silver fountains mud. + Clouds and eclipses stain both moon and sun, + And loathsome canker lives in sweetest bud. + wq sonnet + 195 + $ + + When `ed' opens a file, the current line is initially set to the +last line of that file. Similarly, the move command `m' sets the +current line to the last line moved. + + In summary: + + Structurally, Related programs or routines are `vi (1)', `sed (1)', +`regex (3)', `sh (1)'. Relevant documents are: + + Unix User's Manual Supplementary Documents: 12 -- 13 + + B. W. Kernighan and P. J. Plauger: "Software Tools in Pascal", + Addison-Wesley, 1981. + + +File: ed.info, Node: Invoking Ed, Next: Line Addressing, Prev: Introduction to Line Editing, Up: Top + +3 Invoking Ed +************* + +The format for running `ed' is: + + ed [OPTIONS] [FILE] + red [OPTIONS] [FILE] + + FILE specifies the name of a file to read. If FILE is prefixed with +a bang (!), then it is interpreted as a shell command. In this case, +what is read is the standard output of FILE executed via `sh (1)'. To +read a file whose name begins with a bang, prefix the name with a +backslash (`\'). The default filename is set to FILE only if it is not +prefixed with a bang. + + `ed' supports the following options: + +`--help' +`-h' + Print an informative help message describing the options and exit. + +`--version' +`-V' + Print the version number of `ed' on the standard output and exit. + +`--loose-exit-status' +`-l' + Do not exit with bad status if a command happens to "fail" (for + example if a substitution command finds nothing to replace). This + can be useful when `ed' is invoked as the editor for crontab. + +`--prompt=STRING' +`-p STRING' + Specifies a command prompt. This may be toggled on and off with the + `P' command. + +`--quiet' +`--silent' +`-s' + Suppresses diagnostics. This should be used if `ed''s standard + input is from a script. + +`--traditional' +`-G' + Forces backwards compatibility. This affects the behavior of the + `ed' commands `G', `V', `f', `l', `m', `t' and `!!'. If the + default behavior of these commands does not seem familiar, then + try invoking `ed' with this switch. + +`--verbose' +`-v' + Verbose mode. This may be toggled on and off with the `H' command. + + + +File: ed.info, Node: Line Addressing, Next: Regular Expressions, Prev: Invoking Ed, Up: Top + +4 Line Addressing +***************** + +An address represents the number of a line in the buffer. `ed' +maintains a "current address" which is typically supplied to commands +as the default address when none is specified. When a file is first +read, the current address is set to the last line of the file. In +general, the current address is set to the last line affected by a +command. + + A line address is constructed from one of the bases in the list +below, optionally followed by a numeric offset. The offset may include +any combination of digits, operators (i.e., `+' and `-') and +whitespace. Addresses are read from left to right, and their values may +be absolute or relative to the current address. + + One exception to the rule that addresses represent line numbers is +the address `0' (zero). This means "before the first line," and is +valid wherever it makes sense. + + An address range is two addresses separated either by a comma or +semicolon. The value of the first address in a range cannot exceed the +value of the second. If only one address is given in a range, then the +second address is set to the given address. If an N-tuple of addresses +is given where N > 2, then the corresponding range is determined by the +last two addresses in the N-tuple. If only one address is expected, +then the last address is used. + + Each address in a comma-delimited range is interpreted relative to +the current address. In a semicolon-delimited range, the first address +is used to set the current address, and the second address is +interpreted relative to the first. + + The following address symbols are recognized. + +`.' + 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 next line. This is equivalent to `+1' and may be repeated with + cumulative effect. + +`-' + The previous line. This is equivalent to `-1' and may be repeated + with cumulative effect. + +`+N' +`WHITESPACE N' + The Nth next line, where N is a non-negative number. Whitespace + followed by a number N is interpreted as `+N'. + +`-N' + The Nth previous line, where N is a non-negative number. + +`,' + 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. + +`'x' + The apostrophe-x character pair addresses the line previously + marked by a `k' (mark) command, where `x' is a lower case letter + from the portable character set. + + + +File: ed.info, Node: Regular Expressions, Next: Commands, Prev: Line Addressing, Up: Top + +5 Regular Expressions +********************* + +Regular expressions are patterns used in selecting text. For example, +the `ed' command + + g/STRING/ + +prints all lines containing STRING. Regular expressions are also used +by the `s' command for selecting old text to be replaced with new text. + + In addition to a specifying string literals, regular expressions can +represent classes of strings. Strings thus represented are said to be +matched by the corresponding regular expression. If it is possible for a +regular expression to match several strings in a line, then the +left-most longest match is the one selected. + + The following symbols are used in constructing regular expressions: + +`C' + Any character C not listed below, including `{', `}', `(', `)', + `<' and `>', matches itself. + +`\C' + Any backslash-escaped character C, other than `{', ``}', `(', `)', + `<', `>', `b', `B', `w', `W', `+' and `?', matches itself. + +`.' + Matches any single character. + +`[CHAR-CLASS]' + Matches any single character in CHAR-CLASS. To include a `]' in + CHAR-CLASS, it must be the first character. A range of characters + may be specified by separating the end characters of the range + with a `-', e.g., `a-z' specifies the lower case characters. The + following literal expressions can also be used in CHAR-CLASS to + specify sets of characters: + + [:alnum:] [:cntrl:] [:lower:] [:space:] + [:alpha:] [:digit:] [:print:] [:upper:] + [:blank:] [:graph:] [:punct:] [:xdigit:] + + If `-' appears as the first or last character of CHAR-CLASS, then + it matches itself. All other characters in CHAR-CLASS match + themselves. + + Patterns in CHAR-CLASS of the form: + [.COL-ELM.] + [=COL-ELM=] + + where COL-ELM is a "collating element" are interpreted according + to `locale (5)'. See `regex (3)' for an explanation of these + constructs. + +`[^CHAR-CLASS]' + Matches any single character, other than newline, not in + CHAR-CLASS. CHAR-CLASS is defined as above. + +`^' + If `^' is the first character of a regular expression, then it + anchors the regular expression to the beginning of a line. + Otherwise, it matches itself. + +`$' + If `$' is the last character of a regular expression, it anchors + the regular expression to the end of a line. Otherwise, it matches + itself. + +`\(RE\)' + Defines a (possibly null) subexpression RE. Subexpressions may be + nested. A subsequent backreference of the form `\N', where N is a + number in the range [1,9], expands to the text matched by the Nth + subexpression. For example, the regular expression `\(a.c\)\1' + matches the string `abcabc', but not `abcadc'. Subexpressions are + ordered relative to their left delimiter. + +`*' + Matches the single character regular expression or subexpression + immediately preceding it zero or more times. If `*' is the first + character of a regular expression or subexpression, then it matches + itself. The `*' operator sometimes yields unexpected results. For + example, the regular expression `b*' matches the beginning of the + string `abbb', as opposed to the substring `bbb', since a null + match is the only left-most match. + +`\{N,M\}' +`\{N,\}' +`\{N\}' + Matches the single character regular expression or subexpression + immediately preceding it at least N and at most M times. If M is + omitted, then it matches at least N times. If the comma is also + omitted, then it matches exactly N times. If any of these forms + occurs first in a regular expression or subexpression, then it is + interpreted literally (i.e., the regular expression `\{2\}' + matches the string `{2}', and so on). + +`\<' +`\>' + Anchors the single character regular expression or subexpression + immediately following it to the beginning (in the case of `\<') or + ending (in the case of `\>') of a "word", i.e., in ASCII, a + maximal string of alphanumeric characters, including the + underscore (_). + + + The following extended operators are preceded by a backslash `\' to +distinguish them from traditional `ed' syntax. + +`\`' +`\'' + Unconditionally matches the beginning `\`' or ending `\'' of a + line. + +`\?' + Optionally matches the single character regular expression or + subexpression immediately preceding it. For example, the regular + expression `a[bd]\?c' matches the strings `abc', `adc' and `ac'. + If `\?' occurs at the beginning of a regular expressions or + subexpression, then it matches a literal `?'. + +`\+' + Matches the single character regular expression or subexpression + immediately preceding it one or more times. So the regular + expression `a+' is shorthand for `aa*'. If `\+' occurs at the + beginning of a regular expression or subexpression, then it + matches a literal `+'. + +`\b' + Matches the beginning or ending (null string) of a word. Thus the + regular expression `\bhello\b' is equivalent to `\<hello\>'. + However, `\b\b' is a valid regular expression whereas `\<\>' is + not. + +`\B' + Matches (a null string) inside a word. + +`\w' + Matches any character in a word. + +`\W' + Matches any character not in a word. + + + +File: ed.info, Node: Commands, Next: Limitations, Prev: Regular Expressions, Up: Top + +6 Commands +********** + +All `ed' commands are single characters, though some require additonal +parameters. If a command's parameters extend over several lines, then +each line except for the last must be terminated with a backslash (`\'). + + In general, at most one command is allowed per line. However, most +commands accept a print suffix, which is any of `p' (print), `l' +(list), or `n' (enumerate), to print the last line affected by the +command. + + An interrupt (typically <Control-C>) has the effect of aborting the +current command and returning the editor to command mode. + + `ed' recognizes the following commands. The commands are shown +together with the default address or address range supplied if none is +specified (in parenthesis). + +`(.)a' + Appends text to the buffer after the addressed line, which may be + the address `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 the `!' 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' + Global command. 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. + + At least the first command of COMMAND-LIST must appear on the same + line as the `g' command. All lines of a multi-line COMMAND-LIST + except the last line must be terminated with a backslash (`\'). + Any commands are allowed, except for `g', `G', `v', and `V'. By + default, a newline alone in COMMAND-LIST is equivalent to a `p' + command. If `ed' is invoked with the command-line option `-G', + then a newline in COMMAND-LIST is equivalent to a `.+1p' command. + +`(1,$)G /RE/' + Interactive global command. 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. The address `0' + (zero) is valid for this command; it is equivalent to address `1'. + 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. + +`(.)kx' + Marks a line with a lower case letter `x'. The line can then be + addressed as `'x' (i.e., a single quote followed by `x') in + subsequent commands. The mark is not cleared until the line is + deleted or otherwise modified. + +`(.,.)l' + Prints the addressed lines unambiguously. The end of each line is + marked with a `$', and every `$' character within the text is + printed with a preceding backslash. 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 new address of the last + line moved. + +`(.,.)n' + Prints the addressed lines, preceding each line by its line number + and a <tab>. The current address is set to the last line printed. + +`(.,.)p' + Prints the addressed lines. The current address is set to the last + line printed. + +`P' + Toggles the command prompt on and off. Unless a prompt is + specified with command-line option `-p', 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 is 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/' +`(.,.)s /RE/REPLACEMENT/g' +`(.,.)s /RE/REPLACEMENT/N' + Replaces text in the addressed lines matching a regular expression + RE with REPLACEMENT. By default, only the first match in each line + is replaced. If the `g' (global) suffix is given, then every match + is replaced. The N suffix, where N is a postive number, causes + only the Nth match to be replaced. It is an error if no + substitutions are performed on any of the addressed lines. The + current address is set to the last line affected. + + RE and REPLACEMENT may be delimited by any character other than + <space>, <newline> and the characters used by the form of the `s' + command shown below. If one or two of the last delimiters is + omitted, then the last line affected is printed as if 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 Mth 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, and any combination of the characters `r', `g', + and `p'. If a count suffix N is given, then only the Nth match is + replaced. The `r' suffix causes the regular expression of the last + search to be used instead of the 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' + This is similar to the `g' command except that it applies + COMMAND-LIST to each of the addressed lines not matching the + regular expression RE. + +`(1,$)V /RE/' + This is similar to the `G' command except that it interactively + edits the addressed lines not matching the regular expression RE. + +`(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,$)w !COMMAND' + Writes the addressed lines to the standard input of `!COMMAND', + (see the `!' command below). The default filename and current + address are unchanged. + +`(1,$)wq FILE' + Writes the addressed lines to FILE, and then executes a `q' + command. + +`(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)z N' + 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>' + An address alone prints the addressed line. A <newline> alone is + equivalent to `+1p'. the current address is set to the address of + the printed line. + + + +File: ed.info, Node: Limitations, Next: Diagnostics, Prev: Commands, Up: Top + +7 Limitations +************* + +If the terminal hangs up, `ed' attempts to write the buffer to file +`ed.hup'. + + `ed' processes FILE arguments for backslash escapes, i.e., in a +filename, any characters preceded by a backslash (`\') are interpreted +literally. + + If a text (non-binary) file is not terminated by a newline character, +then `ed' appends one on reading/writing it. In the case of a binary +file, `ed' does not append a newline on reading/writing. + + Per line overhead: 4 `int's. + + +File: ed.info, Node: Diagnostics, Next: Problems, Prev: Limitations, Up: Top + +8 Diagnostics +************* + +When an error occurs, if `ed''s input is from a regular file or here +document, then it exits, otherwise it prints a `?' and returns to +command mode. An explanation of the last error can be printed with the +`h' (help) command. + + If the `u' (undo) command occurs in a global command list, then the +command list is executed only once. + + Attempting to quit `ed' or edit another file before writing a +modified buffer results in an error. If the command is entered a second +time, it succeeds, but any changes to the buffer are lost. + + `ed' exits with 0 if no errors occurred; otherwise >0. + + +File: ed.info, Node: Problems, Next: GNU Free Documentation License, Prev: Diagnostics, Up: Top + +9 Reporting Bugs +**************** + +There are probably bugs in `ed'. There are certainly errors and +omissions in this manual. If you report them, they will get fixed. If +you don't, no one will ever know about them and they will remain unfixed +for all eternity, if not longer. + + If you find a bug in `ed', please send electronic mail to +<bug-ed@gnu.org>. Include the version number, which you can find by +running ``ed' --version'. + + +File: ed.info, Node: GNU Free Documentation License, Prev: Problems, Up: Top + +10 GNU Free Documentation License +********************************* + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + `http://fsf.org/' + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it + can be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You + accept the license if you copy, modify or distribute the work in a + way requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. If a section does not fit the above definition of + Secondary then it is not allowed to be designated as Invariant. + The Document may contain zero Invariant Sections. If the Document + does not identify any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup, or absence of + markup, has been arranged to thwart or discourage subsequent + modification by readers is not Transparent. An image format is + not Transparent if used for any substantial amount of text. A + copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML, PostScript or PDF designed for + human modification. Examples of transparent image formats include + PNG, XCF and JPG. Opaque formats include proprietary formats that + can be read and edited only by proprietary word processors, SGML or + XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML, PostScript or PDF + produced by some word processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a computer-network location from + which the general network-using public has access to download + using public-standard network protocols a complete Transparent + copy of the Document, free of added material. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section Entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the + section all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly + and finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from + you under this License. If your rights have been terminated and + not permanently reinstated, receipt of a copy of some or all of + the same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. If the Document specifies that a proxy + can decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. + + + +Tag Table: +Node: Top544 +Node: Overview2005 +Node: Introduction to Line Editing4062 +Node: Invoking Ed11305 +Node: Line Addressing12953 +Node: Regular Expressions16056 +Node: Commands21401 +Node: Limitations32546 +Node: Diagnostics33121 +Node: Problems33825 +Node: GNU Free Documentation License34360 + +End Tag Table diff --git a/doc/ed.texinfo b/doc/ed.texinfo new file mode 100644 index 0000000..5b77d4d --- /dev/null +++ b/doc/ed.texinfo @@ -0,0 +1,982 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename ed.info +@settitle GNU @command{ed} Manual +@finalout +@c %**end of header + +@set UPDATED 10 July 2009 +@set VERSION 1.4 + +@dircategory Basics +@direntry +* Ed: (ed). The GNU line editor +@end direntry + +@copying +Copyright @copyright{} 1993, 2006, 2007, 2008, 2009 +Free Software Foundation, Inc. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with no +Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. +@end copying + +@titlepage +@title GNU ed +@subtitle The GNU line editor +@subtitle for GNU ed version @value{VERSION}, @value{UPDATED} +@author by Andrew L. Moore and Antonio Diaz Diaz +@page +@vskip 0pt plus 1filll +@insertcopying +@end titlepage + +@contents + +@ifnottex +@node Top +@top The GNU ed line editor + +This manual is for GNU ed (version @value{VERSION}, @value{UPDATED}). + +@sp 1 +GNU ed is an 8-bit clean, more or less POSIX-compliant implementation of +the standard Unix line editor. These days, full-screen editors have +rendered @command{ed} mostly of historical interest. Nonetheless, it +appeals to a handful of aging programmers who still believe that ``Small +is Beautiful''. +@end ifnottex + +@menu +* Overview:: Overview of the @command{ed} command +* Introduction to Line Editing:: Getting started with GNU @command{ed} +* Invoking Ed:: Command line interface +* Line Addressing:: Specifying lines/ranges in the buffer +* Regular Expressions:: Patterns for selecting text +* Commands:: Commands recognized by GNU @command{ed} +* Limitations:: Intrinsic limits of GNU @command{ed} +* Diagnostics:: GNU @command{ed} error handling +* Problems:: Reporting bugs +* GNU Free Documentation License:: How you can copy and share this manual + +@end menu + +@sp 1 +@insertcopying + + +@node Overview +@chapter Overview + +@command{ed} is a line-oriented text editor. It is used to create, +display, modify and otherwise manipulate text files. @command{red} is a +restricted @command{ed}: it can only edit files in the current directory +and cannot execute shell commands. + +If invoked with a @var{file} argument, then a copy of @var{file} is read +into the editor's buffer. Changes are made to this copy and not directly +to @var{file} itself. Upon quitting @command{ed}, any changes not +explicitly saved with a @samp{w} command are lost. + +Editing is done in two distinct modes: @dfn{command} and @dfn{input}. +When first invoked, @command{ed} is in command mode. In this mode +commands are read from the standard input and executed to manipulate the +contents of the editor buffer. A typical command might look like: + +@example +,s/@var{old}/@var{new}/g +@end example + +which replaces all occurences of the string @var{old} with @var{new}. + +When an input command, such as @samp{a} (append), @samp{i} (insert) or +@samp{c} (change), is given, @command{ed} enters input mode. This is the +primary means of adding text to a file. In this mode, no commands are +available; instead, the standard input is written directly to the editor +buffer. A @dfn{line} consists of the text up to and including a +@key{newline} character. Input mode is terminated by entering a single +period (@samp{.}) on a line. + +All @command{ed} commands operate on whole lines or ranges of lines; +e.g., the @samp{d} command deletes lines; the @samp{m} command moves +lines, and so on. It is possible to modify only a portion of a line by +means of replacement, as in the example above. However even here, the +@samp{s} command is applied to whole lines at a time. + +In general, @command{ed} commands consist of zero or more line +addresses, followed by a single character command and possibly +additional parameters; i.e., commands have the structure: + +@example +[@var{address} [,@var{address}]]@var{command}[@var{parameters}] +@end example + +The @var{address}es indicate the line or range of lines to be affected +by the command. If fewer addresses are given than the command accepts, +then default addresses are supplied. + + +@node Introduction to Line Editing +@chapter Introduction to Line Editing + +@command{ed} was created, along with the Unix operating system, by Ken +Thompson and Dennis Ritchie. It is the refinement of its more complex, +programmable predecessor, @cite{QED}, to which Thompson and Ritchie had +already added pattern matching capabilities (@pxref{Regular +Expressions}). + +For the purposes of this tutorial, a working knowledge of the Unix shell +@command{sh} (@pxref{Bash,,, bash, The GNU Bash Reference Manual}) and +the Unix file system is recommended, since @command{ed} is designed to +interact closely with them. + +The principal difference between line editors and display editors is +that display editors provide instant feedback to user commands, whereas +line editors require sometimes lengthy input before any effects are +seen. The advantage of instant feedback, of course, is that if a mistake +is made, it can be corrected immediately, before more damage is done. +Editing in @command{ed} requires more strategy and forethought; but if +you are up to the task, it can be quite efficient. + +Much of the @command{ed} command syntax is shared with other Unix +utilities. + +As with the shell, @key{RETURN} (the carriage-return key) enters a line +of input. So when we speak of ``entering'' a command or some text in +@command{ed}, @key{RETURN} is implied at the end of each line. Prior to +typing @key{RETURN}, corrections to the line may be made by typing +either @key{BACKSPACE} (sometimes labeled @key{DELETE} or @key{DEL}) to +erase characters backwards, or @key{CONTROL}-u (i.e., hold the CONTROL +key and type u) to erase the whole line. + +When @command{ed} first opens, it expects to be told what to do but +doesn't prompt us like the shell. So let's begin by telling @command{ed} +to do so with the @key{P} (@dfn{prompt}) command: + +@example +$ ed +P +* +@end example + +By default, @command{ed} uses asterisk (@samp{*}) as command prompt to +avoid confusion with the shell command prompt (@samp{$}). + +We can run Unix shell (@command{sh}) commands from inside @command{ed} +by prefixing them with @key{!} (exclamation mark, aka ``bang''). For +example: + +@example +*!date +Mon Jun 26 10:08:41 PDT 2006 +! +*!for s in hello world; do echo $s; done +hello +world +! +* +@end example + +So far, this is no different from running commands in the Unix shell. +But let's say we want to edit the output of a command, or save it to a +file. First we must capture the command output to a temporary location +called a @dfn{buffer} where @command{ed} can access it. This is done +with @command{ed}'s @key{r} command (mnemonic: @dfn{read}): + +@example +*r !cal +143 +* +@end example + +Here @command{ed} is telling us that it has just read 143 characters +into the editor buffer - i.e., the output of the @command{cal} command, +which prints a simple ASCII calendar. To display the buffer contents we +issue the @key{p} (@dfn{print}) command (not to be confused with the +prompt command, which is uppercase!). To indicate the range of lines in +the buffer that should be printed, we prefix the command with @key{,} +(comma) which is shorthand for ``the whole buffer'': + +@example +*,p + September 2006 +Mo Tu We Th Fr Sa Su + 1 2 3 + 4 5 6 7 8 9 10 +11 12 13 14 15 16 17 +18 19 20 21 22 23 24 +25 26 27 28 29 30 + +* +@end example + +Now let's write the buffer contents to a file named @code{junk} with the +@key{w} (@dfn{write}) command. Again, we use the @key{,} prefix to +indicate that it's the whole buffer we want: + +@example +*,w junk +143 +* +@end example + +Need we say? It's good practice to frequently write the buffer contents, +since unwritten changes to the buffer will be lost when we exit +@command{ed}. + +The sample sessions below illustrate some basic concepts of line editing +with @command{ed}. We begin by creating a file, @samp{sonnet}, with some +help from Shakespeare. As with the shell, all input to @command{ed} must +be followed by a @key{newline} character. Comments begin with a @samp{#}. + +@example +$ ed +# The `a' command is for appending text to the editor buffer. +a +No more be grieved at that which thou hast done. +Roses have thorns, and filvers foutians mud. +Clouds and eclipses stain both moon and sun, +And loathsome canker lives in sweetest bud. +. +# Entering a single period on a line returns @command{ed} to command mode. +# Now write the buffer to the file @samp{sonnet} and quit: +w sonnet +183 +# @command{ed} reports the number of characters written. +q +$ ls -l +total 2 +-rw-rw-r-- 1 alm 183 Nov 10 01:16 sonnet +$ +@end example + +In the next example, some typos are corrected in the file @samp{sonnet}. + +@example +$ ed sonnet +183 +# Begin by printing the buffer to the terminal with the @samp{p} command. +# The `,' means ``all lines.'' +,p +No more be grieved at that which thou hast done. +Roses have thorns, and filvers foutians mud. +Clouds and eclipses stain both moon and sun, +And loathsome canker lives in sweetest bud. +# Select line 2 for editing. +2 +Roses have thorns, and filvers foutians mud. +# Use the substitute command, @samp{s}, to replace `filvers' with `silver', +# and print the result. +s/filvers/silver/p +Roses have thorns, and silver foutians mud. +# And correct the spelling of `fountains'. +s/utia/untai/p +Roses have thorns, and silver fountains mud. +w sonnet +183 +q +$ +@end example + +Since @command{ed} is line-oriented, we have to tell it which line, or +range of lines we want to edit. In the above example, we do this by +specifying the line's number, or sequence in the buffer. Alternatively, +we could have specified a unique string in the line, e.g., +@samp{/filvers/}, where the @samp{/}s delimit the string in question. +Subsequent commands affect only the selected line, a.k.a. the +@dfn{current} line. Portions of that line are then replaced with the +substitute command, whose syntax is @samp{s/@var{old}/@var{new}/}. + +Although @command{ed} accepts only one command per line, the print +command @samp{p} is an exception, and may be appended to the end of most +commands. + +In the next example, a title is added to our sonnet. + +@example +$ ed sonnet +183 +a + Sonnet #50 +. +,p +No more be grieved at that which thou hast done. +Roses have thorns, and silver fountains mud. +Clouds and eclipses stain both moon and sun, +And loathsome canker lives in sweetest bud. + Sonnet #50 +# The title got appended to the end; we should have used `0a' +# to append ``before the first line.'' +# Move the title to its proper place. +5m0p + Sonnet #50 +# The title is now the first line, and the current line has been +# set to this line as well. +,p + Sonnet #50 +No more be grieved at that which thou hast done. +Roses have thorns, and silver fountains mud. +Clouds and eclipses stain both moon and sun, +And loathsome canker lives in sweetest bud. +wq sonnet +195 +$ +@end example + +When @command{ed} opens a file, the current line is initially set to the +last line of that file. Similarly, the move command @samp{m} sets the +current line to the last line moved. + +In summary: + +Structurally, +Related programs or routines are @command{vi (1)}, @command{sed (1)}, +@command{regex (3)}, @command{sh (1)}. Relevant documents +are: + +@quotation +Unix User's Manual Supplementary Documents: 12 --- 13 +@end quotation + +@quotation +B. W. Kernighan and P. J. Plauger: ``Software Tools in Pascal'', +Addison-Wesley, 1981. +@end quotation + + +@node Invoking Ed +@chapter Invoking Ed + +The format for running @command{ed} is: + +@example +ed [@var{options}] [@var{file}] +red [@var{options}] [@var{file}] +@end example + +@var{file} specifies the name of a file to read. If @var{file} is +prefixed with a bang (!), then it is interpreted as a shell command. In +this case, what is read is the standard output of @var{file} executed +via @command{sh (1)}. To read a file whose name begins with a bang, +prefix the name with a backslash (@kbd{\}). The default filename is set +to @var{file} only if it is not prefixed with a bang. + +@command{ed} supports the following options: + +@table @code +@item --help +@itemx -h +Print an informative help message describing the options and exit. + +@item --version +@itemx -V +Print the version number of @command{ed} on the standard output and exit. + +@item --loose-exit-status +@itemx -l +Do not exit with bad status if a command happens to "fail" (for example +if a substitution command finds nothing to replace). This can be useful +when @command{ed} is invoked as the editor for crontab. + +@item --prompt=@var{string} +@itemx -p @var{string} +Specifies a command prompt. This may be toggled on and off with the +@samp{P} command. + +@item --quiet +@itemx --silent +@itemx -s +Suppresses diagnostics. This should be used if @command{ed}'s standard +input is from a script. + +@item --traditional +@itemx -G +Forces backwards compatibility. This affects the behavior of the +@command{ed} commands @samp{G}, @samp{V}, @samp{f}, @samp{l}, @samp{m}, +@samp{t} and @samp{!!}. If the default behavior of these commands does +not seem familiar, then try invoking @command{ed} with this switch. + +@item --verbose +@itemx -v +Verbose mode. This may be toggled on and off with the @samp{H} command. + +@end table + + +@node Line Addressing +@chapter Line Addressing + +An address represents the number of a line in the buffer. @command{ed} +maintains a @dfn{current address} which is typically supplied to +commands as the default address when none is specified. When a file is +first read, the current address is set to the last line of the file. In +general, the current address is set to the last line affected by a +command. + +A line address is constructed from one of the bases in the list below, +optionally followed by a numeric offset. The offset may include any +combination of digits, operators (i.e., @samp{+} and @samp{-}) and +whitespace. Addresses are read from left to right, and their values may +be absolute or relative to the current address. + +One exception to the rule that addresses represent line numbers is the +address @samp{0} (zero). This means ``before the first line,'' and is +valid wherever it makes sense. + +An address range is two addresses separated either by a comma or +semicolon. The value of the first address in a range cannot exceed the +value of the second. If only one address is given in a range, then the +second address is set to the given address. If an @var{n}-tuple of +addresses is given where @var{n} > 2, then the corresponding range is +determined by the last two addresses in the @var{n}-tuple. If only one +address is expected, then the last address is used. + +Each address in a comma-delimited range is interpreted relative to the +current address. In a semicolon-delimited range, the first address is +used to set the current address, and the second address is interpreted +relative to the first. + +The following address symbols are recognized. + +@table @code +@item . +The current line (address) in the buffer. + +@item $ +The last line in the buffer. + +@item @var{n} +The @var{n}th, line in the buffer where @var{n} is a number in the range +@samp{0,$}. + +@item + +The next line. This is equivalent to @samp{+1} and may be repeated with +cumulative effect. + +@item - +The previous line. This is equivalent to @samp{-1} and may be repeated +with cumulative effect. + +@item +@var{n} +@itemx @var{whitespace} @var{n} +The @var{n}th next line, where @var{n} is a non-negative number. +Whitespace followed by a number @var{n} is interpreted as +@samp{+@var{n}}. + +@item -@var{n} +The @var{n}th previous line, where @var{n} is a non-negative number. + +@item , +The first through last lines in the buffer. This is equivalent to the +address range @samp{1,$}. + +@item ; +The current through last lines in the buffer. This is equivalent to the +address range @samp{.,$}. + +@item /@var{re}/ +The next line containing the regular expression @var{re}. The search +wraps to the beginning of the buffer and continues down to the current +line, if necessary. @samp{//} repeats the last search. + +@item ?@var{re}? +The previous line containing the regular expression @var{re}. The search +wraps to the end of the buffer and continues up to the current line, if +necessary. @samp{??} repeats the last search. + +@item 'x +The apostrophe-x character pair addresses the line previously marked by +a @samp{k} (mark) command, where @samp{x} is a lower case letter from +the portable character set. + +@end table + + +@node Regular Expressions +@chapter Regular Expressions + +Regular expressions are patterns used in selecting text. For example, +the @command{ed} command + +@example +g/@var{string}/ +@end example + +@noindent +prints all lines containing @var{string}. Regular expressions are also +used by the @samp{s} command for selecting old text to be replaced with +new text. + +In addition to a specifying string literals, regular expressions can +represent classes of strings. Strings thus represented are said to be +matched by the corresponding regular expression. If it is possible for a +regular expression to match several strings in a line, then the +left-most longest match is the one selected. + +The following symbols are used in constructing regular expressions: + +@table @code + +@item @var{c} +Any character @var{c} not listed below, including @samp{@{}, @samp{@}}, +@samp{(}, @samp{)}, @samp{<} and @samp{>}, matches itself. + +@item \@var{c} +Any backslash-escaped character @var{c}, other than @samp{@{}, +`@samp{@}}, @samp{(}, @samp{)}, @samp{<}, @samp{>}, @samp{b}, @samp{B}, +@samp{w}, @samp{W}, @samp{+} and @samp{?}, matches itself. + +@item . +Matches any single character. + +@item [@var{char-class}] +Matches any single character in @var{char-class}. To include a @samp{]} +in @var{char-class}, it must be the first character. A range of +characters may be specified by separating the end characters of the +range with a @samp{-}, e.g., @samp{a-z} specifies the lower case +characters. The following literal expressions can also be used in +@var{char-class} to specify sets of characters: + +@example +[:alnum:] [:cntrl:] [:lower:] [:space:] +[:alpha:] [:digit:] [:print:] [:upper:] +[:blank:] [:graph:] [:punct:] [:xdigit:] +@end example + +If @samp{-} appears as the first or last character of @var{char-class}, +then it matches itself. All other characters in @var{char-class} match +themselves. + +Patterns in +@var{char-class} +of the form: +@example +[.@var{col-elm}.] +[=@var{col-elm}=] +@end example + +@noindent +where @var{col-elm} is a @dfn{collating element} are interpreted +according to @code{locale (5)}. See +@code{regex (3)} for an explanation of these constructs. + +@item [^@var{char-class}] +Matches any single character, other than newline, not in +@var{char-class}. @var{char-class} is defined as above. + +@item ^ +If @samp{^} is the first character of a regular expression, then it +anchors the regular expression to the beginning of a line. Otherwise, +it matches itself. + +@item $ +If @samp{$} is the last character of a regular expression, it anchors +the regular expression to the end of a line. Otherwise, it matches +itself. + +@item \(@var{re}\) +Defines a (possibly null) subexpression @var{re}. Subexpressions may be +nested. A subsequent backreference of the form @samp{\@var{n}}, where +@var{n} is a number in the range [1,9], expands to the text matched by +the @var{n}th subexpression. For example, the regular expression +@samp{\(a.c\)\1} matches the string @samp{abcabc}, but not +@samp{abcadc}. Subexpressions are ordered relative to their left +delimiter. + +@item * +Matches the single character regular expression or subexpression +immediately preceding it zero or more times. If @samp{*} is the first +character of a regular expression or subexpression, then it matches +itself. The @samp{*} operator sometimes yields unexpected results. For +example, the regular expression @samp{b*} matches the beginning of the +string @samp{abbb}, as opposed to the substring @samp{bbb}, since a null +match is the only left-most match. + +@item \@{@var{n},@var{m}\@} +@itemx \@{@var{n},\@} +@itemx \@{@var{n}\@} +Matches the single character regular expression or subexpression +immediately preceding it at least @var{n} and at most @var{m} times. If +@var{m} is omitted, then it matches at least @var{n} times. If the comma +is also omitted, then it matches exactly @var{n} times. If any of these +forms occurs first in a regular expression or subexpression, then it is +interpreted literally (i.e., the regular expression @samp{\@{2\@}} +matches the string @samp{@{2@}}, and so on). + +@item \< +@itemx \> +Anchors the single character regular expression or subexpression +immediately following it to the beginning (in the case of @samp{\<}) or +ending (in the case of @samp{\>}) of a @dfn{word}, i.e., in ASCII, a +maximal string of alphanumeric characters, including the underscore (_). + +@end table + +The following extended operators are preceded by a backslash @samp{\} to +distinguish them from traditional @command{ed} syntax. + +@table @code + +@item \` +@itemx \' +Unconditionally matches the beginning @samp{\`} or ending @samp{\'} of a line. + +@item \? +Optionally matches the single character regular expression or +subexpression immediately preceding it. For example, the regular +expression @samp{a[bd]\?c} matches the strings @samp{abc}, @samp{adc} +and @samp{ac}. If @samp{\?} occurs at the beginning of a regular +expressions or subexpression, then it matches a literal @samp{?}. + +@item \+ +Matches the single character regular expression or subexpression +immediately preceding it one or more times. So the regular expression +@samp{a+} is shorthand for @samp{aa*}. If @samp{\+} occurs at the +beginning of a regular expression or subexpression, then it matches a +literal @samp{+}. + +@item \b +Matches the beginning or ending (null string) of a word. Thus the +regular expression @samp{\bhello\b} is equivalent to @samp{\<hello\>}. +However, @samp{\b\b} is a valid regular expression whereas @samp{\<\>} +is not. + +@item \B +Matches (a null string) inside a word. + +@item \w +Matches any character in a word. + +@item \W +Matches any character not in a word. + +@end table + + +@node Commands +@chapter Commands + +All @command{ed} commands are single characters, though some require +additonal parameters. If a command's parameters extend over several +lines, then each line except for the last must be terminated with a +backslash (@samp{\}). + +In general, at most one command is allowed per line. However, most +commands accept a print suffix, which is any of @samp{p} (print), +@samp{l} (list), or @samp{n} (enumerate), to print the last line +affected by the command. + +An interrupt (typically @key{Control-C}) has the effect of aborting the +current command and returning the editor to command mode. + +@command{ed} recognizes the following commands. The commands are shown +together with the default address or address range supplied if none is +specified (in parenthesis). + +@table @code + +@item (.)a +Appends text to the buffer after the addressed line, which may be the +address @samp{0} (zero). Text is entered in input mode. The current +address is set to last line entered. + +@item (.,.)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. + +@item (.,.)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. + +@item e @var{file} +Edits @var{file}, and sets the default filename. If @var{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. + +@item e !@var{command} +Edits the standard output of @samp{!@var{command}}, (see the @samp{!} +command below). The default filename is unchanged. Any lines in the +buffer are deleted before the output of @var{command} is read. The +current address is set to the last line read. + +@item E @var{file} +Edits @var{file} unconditionally. This is similar to the @samp{e} +command, except that unwritten changes are discarded without warning. +The current address is set to the last line read. + +@item f @var{file} +Sets the default filename to @var{file}. If @var{file} is not specified, +then the default unescaped filename is printed. + +@item (1,$)g /@var{re}/@var{command-list} +Global command. Applies @var{command-list} to each of the addressed +lines matching a regular expression @var{re}. The current address is set +to the line currently matched before @var{command-list} is executed. At +the end of the @samp{g} command, the current address is set to the last +line affected by @var{command-list}. + +At least the first command of @var{command-list} must appear on the same +line as the @samp{g} command. All lines of a multi-line +@var{command-list} except the last line must be terminated with a +backslash (@samp{\}). Any commands are allowed, except for @samp{g}, +@samp{G}, @samp{v}, and @samp{V}. By default, a newline alone in +@var{command-list} is equivalent to a @samp{p} command. If @command{ed} +is invoked with the command-line option @samp{-G}, then a newline in +@var{command-list} is equivalent to a @samp{.+1p} command. + +@item (1,$)G /@var{re}/ +Interactive global command. Interactively edits the addressed lines +matching a regular expression @var{re}. For each matching line, the line +is printed, the current address is set, and the user is prompted to +enter a @var{command-list}. At the end of the @samp{G} command, the +current address is set to the last line affected by (the last) +@var{command-list}. + +The format of @var{command-list} is the same as that of the @samp{g} +command. A newline alone acts as a null command list. A single @samp{&} +repeats the last non-null command list. + +@item 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. + +@item h +Prints an explanation of the last error. + +@item (.)i +Inserts text in the buffer before the current line. The address @samp{0} +(zero) is valid for this command; it is equivalent to address @samp{1}. +Text is entered in input mode. The current address is set to the last +line entered. + +@item (.,.+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. + +@item (.)kx +Marks a line with a lower case letter @samp{x}. The line can then be +addressed as @samp{'x} (i.e., a single quote followed by @samp{x}) in +subsequent commands. The mark is not cleared until the line is deleted +or otherwise modified. + +@item (.,.)l +Prints the addressed lines unambiguously. The end of each line is marked +with a @samp{$}, and every @samp{$} character within the text is printed +with a preceding backslash. The current address is set to the last line +printed. + +@item (.,.)m(.) +Moves lines in the buffer. The addressed lines are moved to after the +right-hand destination address, which may be the address @samp{0} +(zero). The current address is set to the new address of the last line +moved. + +@item (.,.)n +Prints the addressed lines, preceding each line by its line number and a +@key{tab}. The current address is set to the last line printed. + +@item (.,.)p +Prints the addressed lines. The current address is set to the last line +printed. + +@item P +Toggles the command prompt on and off. Unless a prompt is specified with +command-line option @samp{-p}, the command prompt is by default turned +off. + +@item q +Quits @command{ed}. + +@item Q +Quits @command{ed} unconditionally. This is similar to the @code{q} +command, except that unwritten changes are discarded without warning. + +@item ($)r @var{file} +Reads @var{file} to after the addressed line. If @var{file} is not +specified, then the default filename is used. If there is no default +filename prior to the command, then the default filename is set to +@var{file}. Otherwise, the default filename is unchanged. The current +address is set to the last line read. + +@item ($)r !@var{command} +Reads to after the addressed line the standard output of +@samp{!command}, (see the @samp{!} command below). The default filename +is unchanged. The current address is set to the last line read. + +@item (.,.)s /@var{re}/@var{replacement}/ +@itemx (.,.)s /@var{re}/@var{replacement}/g +@itemx (.,.)s /@var{re}/@var{replacement}/@var{n} +Replaces text in the addressed lines matching a regular expression +@var{re} with @var{replacement}. By default, only the first match in +each line is replaced. If the @samp{g} (global) suffix is given, then +every match is replaced. The @var{n} suffix, where @var{n} is a postive +number, causes only the @var{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 to the last line affected. + +@var{re} and @var{replacement} may be delimited by any character other +than @key{space}, @key{newline} and the characters used by the form of +the @samp{s} command shown below. If one or two of the last delimiters +is omitted, then the last line affected is printed as if the print +suffix @samp{p} were specified. + +An unescaped @samp{&} in @var{replacement} is replaced by the currently +matched text. The character sequence @samp{\@var{m}} where @var{m} is a +number in the range [1,9], is replaced by the @var{m}th backreference +expression of the matched text. If @var{replacement} consists of a +single @samp{%}, then @var{replacement} from the last substitution is +used. Newlines may be embedded in @var{replacement} if they are escaped +with a backslash (@samp{\}). + +@item (.,.)s +Repeats the last substitution. This form of the @samp{s} command accepts +a count suffix @var{n}, and any combination of the characters @samp{r}, +@samp{g}, and @samp{p}. If a count suffix @var{n} is given, then only +the @var{n}th match is replaced. The @samp{r} suffix causes the regular +expression of the last search to be used instead of the that of the last +substitution. The @samp{g} suffix toggles the global suffix of the last +substitution. The @samp{p} suffix toggles the print suffix of the last +substitution. The current address is set to the last line affected. + +@item (.,.)t(.) +Copies (i.e., transfers) the addressed lines to after the right-hand +destination address, which may be the address @samp{0} (zero). The +current address is set to the last line copied. + +@item u +Undoes the last command and restores the current address to what it was +before the command. The global commands @samp{g}, @samp{G}, @samp{v}, +and @samp{V} are treated as a single command by undo. @samp{u} is its +own inverse. + +@item (1,$)v /@var{re}/@var{command-list} +This is similar to the @samp{g} command except that it applies +@var{command-list} to each of the addressed lines not matching the +regular expression @var{re}. + +@item (1,$)V /@var{re}/ +This is similar to the @samp{G} command except that it interactively +edits the addressed lines not matching the regular expression @var{re}. + +@item (1,$)w @var{file} +Writes the addressed lines to @var{file}. Any previous contents of +@var{file} is lost without warning. If there is no default filename, +then the default filename is set to @var{file}, otherwise it is +unchanged. If no filename is specified, then the default filename is +used. The current address is unchanged. + +@item (1,$)w !@var{command} +Writes the addressed lines to the standard input of +@samp{!@var{command}}, (see the @samp{!} command below). The default +filename and current address are unchanged. + +@item (1,$)wq @var{file} +Writes the addressed lines to @var{file}, and then executes a @samp{q} +command. + +@item (1,$)W @var{file} +Appends the addressed lines to the end of @var{file}. This is similar to +the @samp{w} command, expect that the previous contents of file is not +clobbered. The current address is unchanged. + +@item (.)x +Copies (puts) the contents of the cut buffer to after the addressed +line. The current address is set to the last line copied. + +@item (.,.)y +Copies (yanks) the addressed lines to the cut buffer. The cut buffer is +overwritten by subsequent @samp{y}, @samp{s}, @samp{j}, @samp{d}, or +@samp{c} commands. The current address is unchanged. + +@item (.+1)z @var{n} +Scrolls @var{n} lines at a time starting at addressed line. If @var{n} +is not specified, then the current window size is used. The current +address is set to the last line printed. + +@item !@var{command} +Executes @var{command} via @command{sh (1)}. If the first character of +@var{command} is @samp{!}, then it is replaced by text of the previous +@samp{!@var{command}}. @command{ed} does not process @var{command} for +backslash (@samp{\}) escapes. However, an unescaped @samp{%} is replaced +by the default filename. When the shell returns from execution, a +@samp{!} is printed to the standard output. The current line is +unchanged. + +@item (.,.)# +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. + +@item ($)= +Prints the line number of the addressed line. + +@item (.+1)@key{newline} +An address alone prints the addressed line. A @key{newline} alone is +equivalent to @samp{+1p}. the current address is set to the address of +the printed line. + +@end table + + +@node Limitations +@chapter Limitations + +If the terminal hangs up, @command{ed} attempts to write the buffer to +file @file{ed.hup}. + +@command{ed} processes @var{file} arguments for backslash escapes, i.e., +in a filename, any characters preceded by a backslash (@samp{\}) are +interpreted literally. + +If a text (non-binary) file is not terminated by a newline character, +then @command{ed} appends one on reading/writing it. In the case of a +binary file, @command{ed} does not append a newline on reading/writing. + +Per line overhead: 4 @code{int}s. + + +@node Diagnostics +@chapter Diagnostics + +When an error occurs, if @command{ed}'s input is from a regular file or +here document, then it exits, otherwise it prints a @samp{?} and returns +to command mode. An explanation of the last error can be printed with +the @samp{h} (help) command. + +If the @samp{u} (undo) command occurs in a global command list, then the +command list is executed only once. + +Attempting to quit @command{ed} or edit another file before writing a +modified buffer results in an error. If the command is entered a second +time, it succeeds, but any changes to the buffer are lost. + +@command{ed} exits with 0 if no errors occurred; otherwise >0. + + +@node Problems +@chapter Reporting Bugs + +There are probably bugs in @command{ed}. There are certainly errors and +omissions in this manual. If you report them, they will get fixed. If +you don't, no one will ever know about them and they will remain unfixed +for all eternity, if not longer. + +If you find a bug in @command{ed}, please send electronic mail to +@email{bug-ed@@gnu.org}. Include the version number, which you can +find by running @w{@samp{@command{ed} --version}}. + + +@node GNU Free Documentation License +@chapter GNU Free Documentation License +@include fdl.texinfo + +@bye diff --git a/doc/fdl.texinfo b/doc/fdl.texinfo new file mode 100644 index 0000000..8805f1a --- /dev/null +++ b/doc/fdl.texinfo @@ -0,0 +1,506 @@ +@c The GNU Free Documentation License. +@center Version 1.3, 3 November 2008 + +@c This file is intended to be included within another document, +@c hence no sectioning command or @node. + +@display +Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. +@uref{http://fsf.org/} + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The ``publisher'' means any person or entity that distributes copies +of the Document to the public. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +@item +RELICENSING + +``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the +site means any set of copyrightable works thus published on the MMC +site. + +``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +``Incorporate'' means to publish or republish a Document, in whole or +in part, as part of another Document. + +An MMC is ``eligible for relicensing'' if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole +or in part into the MMC, (1) had no cover texts or invariant sections, +and (2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + +@end enumerate + +@page +@heading ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with@dots{}Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + |