sbase/ed.1
Roberto E. Vargas Caballero 79bc44c184 ed: Correct behaviour of shell escape in r and w
Shell escapes in these commands do not print a ! after its execution
but it prints the number of bytes read/write.
2025-12-31 13:19:34 +01:00

336 lines
9.3 KiB
Groff

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