added man page (draft)
fixed `!' command final code cleanup
This commit is contained in:
parent
e621c508ff
commit
20d732999d
@ -1,7 +1,6 @@
|
||||
PROG =ed
|
||||
CFLAGS+=-DDES -DGNU_REGEX
|
||||
CFLAGS+=-DDES -DGNU_REGEX
|
||||
SRCS= ed.c re.c buf.c cbc.c
|
||||
LDADD= -lgnuregex
|
||||
NOMAN= noman
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
54
bin/ed/POSIX
Normal file
54
bin/ed/POSIX
Normal file
@ -0,0 +1,54 @@
|
||||
This version of ed is not strictly POSIX compliant, as described in the
|
||||
POSIX 1003.2 Draft 11.2 document. BSD commands have been implemented
|
||||
wherever they do not conflict with the POSIX standard. For backwards
|
||||
compatibility, the POSIX rule that says a range of addresses cannot be
|
||||
used where only a single address is expected has been relaxed.
|
||||
|
||||
The BSD commands included are:
|
||||
1) the `s' command (i.e., s[rgp]*) to repeat a previous substitution,
|
||||
2) the `W' command for appending text to an existing file,
|
||||
3) the `wq' command for exiting after a write, and
|
||||
4) the `z' command for scrolling through the buffer.
|
||||
BSD line addressing syntax (i.e., `^' and `%'). is also recognized.
|
||||
|
||||
The POSIX interactive global commands `G' and `V' are extended to support
|
||||
multiple commands, including `a', `i' and `c'. The command format is the
|
||||
same as for the global commands `g' and `v', i.e., one command per line
|
||||
with each line, except for the last, ending in a backslash (\).
|
||||
|
||||
If crypt is available, files can be read and written using DES encryption.
|
||||
The `x' command prompts the user to enter a key used for encrypting/
|
||||
decrypting subsequent reads and writes. If only a newline is entered as
|
||||
the key, then encryption is disabled. Otherwise, a key is read in the
|
||||
same manner as a password entry. The key remains in effect until
|
||||
encryption is disabled. For more information on the encryption algorithm,
|
||||
see the bdes(1) man page. Encryption/decryption should be fully compatible
|
||||
with SunOS DES.
|
||||
|
||||
An extension to the POSIX file commands `E', `e', `r', `W' and `w' is that
|
||||
<file> arguments are processed for backslash escapes, i.e., any character
|
||||
preceded by a backslash is interpreted literally. A trailing backslash
|
||||
is ignored. If the first unescaped character of a <file> argument is a
|
||||
bang (!), then the rest of the line is interpreted as a shell command,
|
||||
and no escape processing is performed by ed. This rule does not apply to
|
||||
the 'f' command (described below).
|
||||
|
||||
While the default file name cannot be set to a shell command (i.e.,
|
||||
!<shell-cmd>) via any of the `r', `w', and `e' commands, POSIX evidently
|
||||
does not preclude using the `f' command for this purpose. Upon reading
|
||||
or writing the default file when its name begins with a bang, ed
|
||||
interprets the rest of the line as a shell command and attempts to execute
|
||||
it. Escape processing is not performed in this case.
|
||||
|
||||
If ed is invoked with a name argument prefixed by a bang, then the
|
||||
remainder of the argument is interpreted as a shell command. To invoke
|
||||
ed on a file whose name starts with bang, prefix the name with a backslash.
|
||||
--
|
||||
The following commands are neither part of POSIX 1003.2 D11/2 nor are
|
||||
they supported in this version of ed.
|
||||
|
||||
The vi command: (addr1,addr2) !<shell-cmd> which replaces a range of
|
||||
lines with the output of a shell command is not supported.
|
||||
|
||||
The vi command: [rwe] !!, where !! is replaced by the previous
|
||||
!<shell-cmd> is not supported.
|
@ -7,11 +7,11 @@ GNU_REGEX - use with GNU regex(3)
|
||||
DES - use to add encryption support (requires crypt(3))
|
||||
NO_REALLOC_NULL - use if realloc(3) does not accept a NULL pointer
|
||||
|
||||
The file `ed-1003.2' in the ./doc directory describes POSIX ed. Extensions
|
||||
to the POSIX standard are described in the file `extensions.'
|
||||
The file `POSIX' describes extensions to and deviations from the POSIX
|
||||
standard.
|
||||
|
||||
The ./test directory contains regression tests for ed. The README
|
||||
file in that directory explains how to run these.
|
||||
|
||||
For a description of the ed algorithm, see Kernighan and Pike's book
|
||||
For a description of the ed algorithm, see Kernighan and Plauger's book
|
||||
"Software Tools in Pascal," Addison-Wesley, 1981.
|
||||
|
@ -62,7 +62,7 @@ char *
|
||||
gettxt(lp)
|
||||
line_t *lp;
|
||||
{
|
||||
static char txtbuf[MAXLINE];
|
||||
static char buf[MAXLINE];
|
||||
int len, ct;
|
||||
|
||||
if (lp == &line0)
|
||||
@ -78,14 +78,14 @@ gettxt(lp)
|
||||
}
|
||||
}
|
||||
len = lp->len & ~ACTV;
|
||||
if ((ct = fread(txtbuf, sizeof(char), len, sfp)) < 0 || ct != len) {
|
||||
if ((ct = fread(buf, sizeof(char), len, sfp)) < 0 || ct != len) {
|
||||
fprintf(stderr, "%s\n", strerror(errno));
|
||||
sprintf(errmsg, "cannot read temp file");
|
||||
return (char *) ERR;
|
||||
}
|
||||
sfseek += len; /* update file position */
|
||||
txtbuf[len] = '\0';
|
||||
return txtbuf;
|
||||
buf[len] = '\0';
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
|
894
bin/ed/ed.1
Normal file
894
bin/ed/ed.1
Normal file
@ -0,0 +1,894 @@
|
||||
.TH ED 1 386BSD
|
||||
.SH NAME
|
||||
ed \- text editor
|
||||
.SH SYNOPSIS
|
||||
ed [-] [-sx] [-p string] [file]
|
||||
.SH DESCRIPTION
|
||||
.B ed
|
||||
is a line-oriented text editor.
|
||||
It is used to create, display, modify and otherwise manipulate text
|
||||
files.
|
||||
|
||||
If invoked with the
|
||||
.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 editing 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/gp
|
||||
.RE
|
||||
.sp
|
||||
which replaces all occurences 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. 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(s) to be affected by the command.
|
||||
If fewer addresses are given than the command accepts, then default
|
||||
addresses are supplied.
|
||||
|
||||
.SS OPTIONS
|
||||
.TP 8
|
||||
-s
|
||||
Suppresses diagnostics. This should be used if
|
||||
.BR ed 's
|
||||
standard input is from a script.
|
||||
|
||||
.TP 8
|
||||
-x
|
||||
Prompts for an encryption key to be used in subsequent reads and writes
|
||||
(see the
|
||||
.I `x'
|
||||
command).
|
||||
|
||||
.TP 8
|
||||
.RI \-p \ string
|
||||
Specifies a command prompt. This may be toggled on and off with the
|
||||
.I `P'
|
||||
command.
|
||||
|
||||
.TP 8
|
||||
name
|
||||
Specifies the name of a file to read. If
|
||||
.I name
|
||||
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 name
|
||||
executed via
|
||||
.IR sh (1).
|
||||
To read a file whose name begins with a bang, prefix the
|
||||
name with a backslash (\\).
|
||||
|
||||
.SS LINE ADDRESSING
|
||||
An address represents the number of 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 + ,
|
||||
.I -
|
||||
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
|
||||
semi-colon. The value of the first address in a range cannot exceed the
|
||||
value of the the second. 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 semi-colon-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
|
||||
\fR.\fR
|
||||
The current line (address) in the buffer.
|
||||
|
||||
.TP 8
|
||||
$
|
||||
The last line in the buffer.
|
||||
|
||||
.TP 8
|
||||
n
|
||||
The
|
||||
.IR n th,
|
||||
line in the buffer
|
||||
where
|
||||
.I n
|
||||
is a number in the range
|
||||
.I [0,$].
|
||||
|
||||
.TP 8
|
||||
- or ^
|
||||
The previous line.
|
||||
This is equivalent to
|
||||
.I -1
|
||||
and may be repeated with cumulative effect.
|
||||
|
||||
.TP 8
|
||||
-\fIn\fR or ^\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.
|
||||
|
||||
.TP 8
|
||||
+\fIn\fR or whitespace\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
|
||||
, \fRor\fB %
|
||||
The first through last lines in the buffer. This is equivalent to
|
||||
the address range
|
||||
.I 1,$.
|
||||
|
||||
.TP 8
|
||||
;
|
||||
The
|
||||
current through last lines in the buffer. This is equivalent to
|
||||
the address range
|
||||
.I .,$.
|
||||
|
||||
.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
|
||||
\fR\\\fIc\fR
|
||||
Any backslash-escaped character
|
||||
.IR c ,
|
||||
except for `{', '}', `(', `)', `<' and `>',
|
||||
matches itself.
|
||||
|
||||
.TP 8
|
||||
\fR.\fR
|
||||
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.
|
||||
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.
|
||||
|
||||
.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
|
||||
\fR\\<\fR
|
||||
Anchors the single character regular expression or subexpression
|
||||
immediately following it to the beginning of a word.
|
||||
(This may not be available)
|
||||
|
||||
.TP 8
|
||||
\fR\\>\fR
|
||||
Anchors the single character regular expression or subexpression
|
||||
immediately following it to the end of a word.
|
||||
(This may not be available)
|
||||
|
||||
.TP 8
|
||||
\fR\\(\fIre\fR\\)\fR
|
||||
Defines a subexpression
|
||||
.IR re .
|
||||
Subexpressions may be nested.
|
||||
A subsequent backreference of the form \fI`\\n'\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 `\\(.*\\)\\1' matches any string
|
||||
consisting of identical adjacent substrings.
|
||||
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.
|
||||
|
||||
.TP 8
|
||||
\fR\\{\fIn,m\fR\\}\fR or \fR\\{\fIn,\fR\\}\fR or \fR\\{\fIn\fR\\}\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.
|
||||
|
||||
.SS COMMANDS
|
||||
All
|
||||
.B ed
|
||||
commands are single characters, though some require additonal parameters.
|
||||
If a command's paramters extend over several lines, then
|
||||
each line except for the last
|
||||
must end in a backslash (\\).
|
||||
|
||||
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.
|
||||
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
|
||||
.RI e \ !command
|
||||
Edits the standard output of
|
||||
.I command
|
||||
executed via
|
||||
.IR sh (1).
|
||||
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 \ name
|
||||
Edits
|
||||
.I name
|
||||
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 \ name
|
||||
Sets the default filename to
|
||||
.IR name .
|
||||
If
|
||||
.I name
|
||||
is not specified, then the default unescaped filename is printed.
|
||||
If
|
||||
.I name
|
||||
is prefixed with a bang (!), then
|
||||
it is executed as a command via
|
||||
.IR sh (1),
|
||||
in subsequent reads and writes.
|
||||
|
||||
.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
|
||||
(\\).
|
||||
Any commands are allowed, except for
|
||||
.IR `g' ,
|
||||
.IR `G' ,
|
||||
.IR `v' ,
|
||||
and
|
||||
.IR `V' .
|
||||
|
||||
.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 command list.
|
||||
At the end of the
|
||||
.I `G'
|
||||
command, the current address
|
||||
is set to the last line affected by the command
|
||||
list.
|
||||
|
||||
The format of the 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.
|
||||
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
|
||||
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. 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
|
||||
.RI ($)r \ !command
|
||||
Reads the standard output of
|
||||
.I command
|
||||
executed via
|
||||
.IR sh (1)
|
||||
to after the addressed line.
|
||||
The default filename is unchanged.
|
||||
The current address is set to the last line read.
|
||||
|
||||
.TP 8
|
||||
.RI (.,.)s /re/replacement/[gn]
|
||||
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.
|
||||
The
|
||||
.I `g'
|
||||
(global) suffix causes every match to be replaced.
|
||||
The
|
||||
.I `n'
|
||||
suffix, where
|
||||
.I n
|
||||
is a postive number, causes only the
|
||||
.IR n th
|
||||
match to be replaced.
|
||||
The current address is set the last line affected.
|
||||
|
||||
An unescaped `&' in
|
||||
.I replacement
|
||||
is replaced by the currently matched text.
|
||||
The character sequence
|
||||
\fI`\\m'\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 included in
|
||||
.I replacement
|
||||
if they are escaped with a backslash (\\).
|
||||
|
||||
.I re
|
||||
and
|
||||
.I replacement
|
||||
may be delimited by any character other than space and newline.
|
||||
If one or two of the last delimiters is omitted, then the affected lines
|
||||
are printed as though the print suffix
|
||||
.I `p'
|
||||
were specified.
|
||||
|
||||
.TP 8
|
||||
.RI (.,.)s [rgp]*
|
||||
Repeats the last substitution.
|
||||
This form of the
|
||||
.I `s'
|
||||
command may be suffixed with
|
||||
any combination of the characters
|
||||
.IR `r' ,
|
||||
.IR `g' ,
|
||||
and
|
||||
.IR `p' .
|
||||
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.
|
||||
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 /pat/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
|
||||
.RI (1,$)w \ !command
|
||||
Writes the addressed lines to the standard input of
|
||||
.I command
|
||||
executed via
|
||||
.IR sh (1).
|
||||
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
|
||||
Prompts for an encryption key which is used in subsequent reads and
|
||||
writes. If a newline alone is entered as the key, then encryption is
|
||||
turned off. Otherwise, echoing is disabled while a key is read.
|
||||
Encryption/decryption is done using the bdes(1) algorithm.
|
||||
|
||||
.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
|
||||
!command
|
||||
Runs
|
||||
.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 (\\) escapes.
|
||||
However, an unescaped
|
||||
.I `%'
|
||||
is replaced by the default file name.
|
||||
When the shell returns from execution, a `!'
|
||||
is printed to the standard output.
|
||||
The current line 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 20
|
||||
/tmp/ed.*
|
||||
Buffer file
|
||||
.TP 20
|
||||
\fR./ed.hup\fR, $HOME/ed.hup
|
||||
First and second files 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 bdes (1),
|
||||
.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 (\\) are
|
||||
interpreted literally.
|
||||
|
||||
When reading a file into the editor buffer, ASCII NUL characters are
|
||||
discarded, and long lines are split by insertion of a newline.
|
||||
If the file is not terminated by a newline, then one is appended.
|
||||
.B ed
|
||||
prints a diagnostic indicating any modifications.
|
||||
|
||||
maximum line length: 4096 chars
|
||||
|
||||
per line overhead: 4 ints
|
||||
|
||||
.SH DIAGNOSTICS
|
||||
When an error occurs,
|
||||
.B ed
|
||||
prints a `?' and returns to command mode.
|
||||
An explanation of the last error can be
|
||||
printed with the
|
||||
.I `h'
|
||||
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 buffer are lost.
|
637
bin/ed/ed.c
637
bin/ed/ed.c
File diff suppressed because it is too large
Load Diff
@ -164,7 +164,7 @@ int docmd __P((int));
|
||||
int err __P((char *));
|
||||
char *ccl __P((int, char *));
|
||||
int cvtkey __P((char *, char *));
|
||||
long doglob __P((void));
|
||||
long doglob __P((int));
|
||||
void dohup __P((int));
|
||||
void dointr __P((int));
|
||||
void dowinch __P((int));
|
||||
@ -173,9 +173,8 @@ long doread __P((long, char *));
|
||||
long dowrite __P((long, long, char *, char *));
|
||||
char *esctos __P((char *));
|
||||
long find __P((pattern_t *, int));
|
||||
void freecmdv __P((void));
|
||||
long getaddr __P((line_t *));
|
||||
char *getcmdv __P((void));
|
||||
char *getcmdv __P((int));
|
||||
char *getfn __P((void));
|
||||
int getkey __P((void));
|
||||
char *getlhs __P((int));
|
||||
@ -185,6 +184,7 @@ long getnum __P((int));
|
||||
long getone __P((void));
|
||||
line_t *getptr __P((long));
|
||||
int getrhs __P((char *, int));
|
||||
int getshcmd __P((char **));
|
||||
char *gettxt __P((line_t *));
|
||||
int join __P((long, long));
|
||||
line_t *lpdup __P((line_t *));
|
||||
|
@ -62,7 +62,7 @@ optpat()
|
||||
int n;
|
||||
|
||||
if ((delim = *ibufp) == '\n') {
|
||||
sprintf(errmsg, "no previous pattern");
|
||||
if (!exp) sprintf(errmsg, "no previous pattern");
|
||||
return exp;
|
||||
} else if (delim == ' ' || *++ibufp == '\n') {
|
||||
sprintf(errmsg, "invalid pattern delimiter");
|
||||
|
Loading…
Reference in New Issue
Block a user