NAME
sed - Provides a stream line editor
SYNOPSIS
sed [-n] [-e escript...] [script] [-f source_file] [file
...]
The sed command modifies lines from the specified file or
from standard input according to edit commands and writes
them to standard output.
FLAGS
-e escript
Uses the string script as an editing script. If you are
using just one -e flag and no -f flag, you can omit the
-e flag and include the single script on the command
line as an argument to sed.
-f source_file
Uses source_file as the source of the edit script. The
source_file is a set of editing commands to be applied
to file.
-n Suppresses all information normally written to standard
output.
DESCRIPTION
The sed command includes many features for selecting lines
to be modified and making changes only to the selected
lines.
The sed command uses two work spaces for holding the line
being modified: the pattern space, where the selected line
is held, and the hold space, where a line can be stored tem-
porarily.
An edit script consists of individual subcommands, each one
on a separate line. The general form of sed subcommands is
as follows:
[address_range] function [modifier ...]
The sed command processes each input file by reading an
input line into a pattern space, sequentially applying all
sed subcommands in sequence whose addresses select that
line, and writing the pattern space to standard output. It
then clears the pattern space and repeats this process for
each line in the input file. Some of the subcommands use a
hold space to save all or part of the pattern space for
subsequent retrieval.
When a command includes an address, either a line number or
a search pattern, only the addressed line or lines are
affected by the command. Otherwise, the command is applied
to all lines.
The sed Addresses
An address is either a decimal line number, a $, which
addresses the last line of input, or a context address. A
context address is a regular expression as described for
grep, except that you can select the character delimiter for
patterns. The general form of the expression is as follows:
\?pattern\?
The ? represents a character delimiter you select. This
delimiter cannot be a multibyte character.
The default form for the pattern is as follows:
/pattern/
o The sequence \n matches a newline character in the pat-
tern space, except the terminating new line.
o A . (dot) matches any character except a terminating
newline character. That is, unlike grep, which cannot
match a newline character in the middle of a line, sed
can match a newline character in the pattern space.
Certain commands allow you to specify one line or a range of
lines to which the command applies. These commands are
called addressed commands. The following rules apply to
addressed commands:
o A command line with no address selects every line.
o A command line with one address, expressed in context
form, selects each line that matches the address.
o A command line with two addresses separated by a ,
(comma) or ; (semicolon) selects the entire range from
the first line that matches the first address through
the next line that matches the second. (If the second
address is a number less than or equal to the line
number first selected, only one line is selected.)
Thereafter, the process is repeated, looking again for
the first address.
SUBCOMMANDS
Backslashes in text are treated like backslashes in the
replacement string of an s command and can be used to pro-
tect initial spaces and tabs against the stripping that is
done on every script line.
The text argument accompanying the a\, c\, and i\ commands
can continue onto more than one line, provided all lines but
the last end with a \ (backslash) to quote the newline char-
acter.
The read_file and write_file arguments must end the command
line and must be preceded by exactly one space. Each
write_file is created before processing begins.
The sed command can process up to 99 commands in a file.
In the following list of subcommands, the maximum number of
permissible addresses for each subcommand is indicated in
parentheses. The sed script subcommands are as follows:
(1) a\
text
Places text on the output before reading the next input
line.
(2)b[label]
Branches to the : command bearing the label. If label
is empty, it branches to the end of the script.
(2)c\
text
Deletes the pattern space. With a 0 or 1 address or at
the end of a 2-address range, places text on the output.
Then it starts the next cycle.
(2)d
Deletes the pattern space. Then it starts the next
cycle.
(2)D
Deletes the initial segment of the pattern space through
the first newline character. Then it starts the next
cycle.
(2)g
Replaces the contents of the pattern space with the con-
tents of the hold space.
(2)G
Appends the contents of the hold space to the pattern
space.
(2)h
Replaces the contents of the hold space with the con-
tents of the pattern space.
(2)H
Appends the contents of the pattern space to the hold
space.
(1)i\
text
Writes text to standard output before reading the next
line into the pattern space.
(2)l
Writes the pattern space to standard output, showing
nondisplayable characters as hexadecimal values. Long
lines are folded.
(2)n
Writes the pattern space to standard output. It
replaces the pattern space with the next line of input.
(2)N
Appends the next line of input to the pattern space with
an embedded newline character. (The current line number
changes.) You can use this to search for patterns that
are split onto two lines.
(2)p
Writes the pattern space to standard output.
(2)P
Writes the initial segment of the pattern space through
the first newline character to standard output.
(1)q
Branches to the end of the script. It does not start a
new cycle.
(1)r read_file
Reads the contents of read_file. It places contents on
the output before reading the next input line.
(2)s/pattern/replacement/flags
Substitutes the replacement string for the first
occurrence of the pattern in the pattern space. Any
character that is displayed after the s command can sub-
stitute for the / (slash) separator.
You can add zero or more of the following flags:
n Where n is 1 to 512, substitutes replacement for the
nth occurrence of pattern on each addressed line,
rather than for the first occurrence.
g Substitutes replacement for all nonoverlapping
instances of pattern on each addressed line, rather
than for just the first one (or for the one speci-
fied by n).
p Writes the pattern space to standard output if a
replacement was made.
w write_file
Writes the pattern space to write_file if a replace-
ment was made. Appends the pattern space to
write_file. If write_file was not already created
by a previous write by this sed script, sed creates
it. Each write_file is created before processing
begins.
(2)t[label]
Branches to :label in the script file if any substitu-
tions were made since the most recent reading of an
input line execution of a t subcommand. If you do not
specify label, control transfers to the end of the
script.
(2)w write_file
Appends the pattern space to write_file.
(2)x
Exchanges the contents of the pattern space and the hold
space.
(2)y/pattern1/pattern2/
Replaces all occurrences of characters in pattern1 with
the corresponding characters from pattern2. pattern1 and
pattern2 must contain the same number of characters.
(2)!sed_command
Applies the specified sed subcommand only to lines not
selected by the address or addresses.
(0):label
This script entry simply marks a branch point to be
referenced by the b and t commands. This label can be
any sequence of eight or fewer bytes.
(1)=
Writes the current line number to standard output as a
line.
(2){subcommand ...
} Groups subcommands enclosed in { } (braces).
(0) Ignores an empty command.
(0)#
If a # (number sign) appears as the first character on
the first line of a script file, that entire line is
treated as a comment, with one exception. If the char-
acter after the # is an n, the default output is
suppressed. The rest of the line after the #n is
ignored. A script must contain at least one noncomment
line.
EXAMPLES
1. To perform a global change, enter:
sed "s/happy/enchanted/g" chap1 >chap1.new
This replaces each occurrence of happy found in the
file chap1 with enchanted, and puts the edited version
in a separate file named chap1.new. The g at the end
of the s subcommand tells sed to make as many substitu-
tions as possible on each line. Without the g, sed
replaces only the first happy on a line.
The sed stream editor operates as a filter. It reads
text from standard input or from the files named on the
command line (chap1 in this example), modifies this
text, and writes it to standard output. Unlike most
editors, it does not replace the original file. This
makes sed a powerful command when used in pipelines.
2. To use sed as a filter in a pipeline (sh only), enter:
pr chap2 | sed "s/Page *[0-9]*$/(&)/" | print
This encloses the page numbers in parentheses before
printing chap2. The pr command puts a heading and page
number at the top of each page, then sed puts the page
numbers in parentheses, and the print command prints
the edited listing.
The sed pattern /Page *[0-9]*$/ matches page numbers
that appear at the end of a line. The s subcommand
changes this to (&), where the & stands for the pattern
that was matched (for example, Page 5).
3. To display selected lines of a file, enter:
sed -n "/food/p" chap3
This displays each line in chap3 that contains the word
food. Normally, sed copies every line to standard out-
put after it is edited. The -n flag stops sed from
doing this. You then use subcommands like p to write
specific parts of the text. Without the -n, this exam-
ple displays all the lines in chap3, and it shows each
line containing food twice.
4. To perform complex editing, enter:
sed -f script.sed chap4 >chap4.new
It is always a good idea to create a sed script file
when you want to do anything complex. You can then
test and modify your script before using it. You can
also reuse your script to edit other files. Create the
script file with an interactive text editor.
5. A sample sed script follows:
:join
/\\$/{N
s/\\\n//
b join
}
This sed script joins each line that ends with a \
(backslash) to the line that follows it. First, the
pattern /\\$/ selects a line that ends with a \ for the
group of commands enclosed in { }. The N subcommand
then appends the next line, embedding a newline
character. The s/\\\n// deletes the \ (backslash) and
embedded newline character. Finally, b join branches
back to the label :join to check for a \ (backslash) at
the end of the newly joined line. Without the branch,
sed writes the joined line and reads the next one
before checking for a second \ character.
The N subcommand causes sed to stop immediately if
there are no more lines of input (that is, if N reads
the End-of-File character). It does not copy the pat-
tern space to standard output before stopping. This
means that if the last line of the input ends with a \
(backslash) character, then it is not copied to the
output.
RELATED INFORMATION
Commands: awk(1), grep(1)/egrep(1)/fgrep(1),
vi(1)/vedit(1)/view(1).
Acknowledgement and Disclaimer