C.1. Sed
Sed is a non-interactive line editor. It receives text
input, whether from stdin or from a
file, performs certain operations on specified lines of
the input, one line at a time, then outputs the result to
stdout or to a file. Within a shell script,
sed is usually one of several tool components in a pipe.
Sed determines which lines of its input that it will
operate on from the address range passed
to it.
Specify this address range either by line number or by a
pattern to match. For example, 3d
signals sed to delete line 3 of the input, and
/windows/d tells sed that
you want every line of the input containing a match to
"windows" deleted.
Of all the operations in the sed toolkit, we will focus
primarily on the three most commonly used
ones. These are printing (to
stdout), deletion,
and substitution.
Table C-1. Basic sed operators
Operator | Name | Effect |
---|
[address-range]/p | print | Print [specified address range] |
[address-range]/d | delete | Delete [specified address range] |
s/pattern1/pattern2/ | substitute | Substitute pattern2 for first instance of pattern1 in a line |
[address-range]/s/pattern1/pattern2/ | substitute | Substitute pattern2 for first instance of pattern1 in a
line, over address-range |
[address-range]/y/pattern1/pattern2/ | transform | replace any character in pattern1 with the
corresponding character in pattern2, over
address-range (equivalent of
tr) |
g | global | Operate on every pattern match
within each matched line of input |
| Unless the g
(global) operator is appended to a
substitute command, the substitution
operates only on the first instance of a pattern match within
each line. |
From the command line and in a shell script, a sed operation may
require quoting and certain options.
sed -e '/^$/d' $filename
# The -e option causes the next string to be interpreted as an editing instruction.
# (If passing only a single instruction to "sed", the "-e" is optional.)
# The "strong" quotes ('') protect the RE characters in the instruction
#+ from reinterpretation as special characters by the body of the script.
# (This reserves RE expansion of the instruction for sed.)
#
# Operates on the text contained in file $filename. |
In certain cases, a sed editing command will
not work with single quotes.
filename=file1.txt
pattern=BEGIN
sed "/^$pattern/d" "$filename" # Works as specified.
# sed '/^$pattern/d' "$filename" has unexpected results.
# In this instance, with strong quoting (' ... '),
#+ "$pattern" will not expand to "BEGIN". |
| Sed uses the -e option
to specify that the following string is an instruction or set
of instructions. If there is only a single instruction contained
in the string, then this option may be omitted. |
sed -n '/xzy/p' $filename
# The -n option tells sed to print only those lines matching the pattern.
# Otherwise all input lines would print.
# The -e option not necessary here since there is only a single editing instruction. |
Table C-2. Examples of sed operators
Notation | Effect |
---|
8d | Delete 8th line of input. |
/^$/d | Delete all blank lines. |
1,/^$/d | Delete from beginning of input up to, and including
first blank line. |
/Jones/p | Print only lines containing "Jones" (with
-n option). |
s/Windows/Linux/ | Substitute "Linux" for first instance
of "Windows" found in each input line. |
s/BSOD/stability/g | Substitute "stability" for every instance
of "BSOD" found in each input line. |
s/ *$// | Delete all spaces at the end of every line. |
s/00*/0/g | Compress all consecutive sequences of zeroes into
a single zero. |
/GUI/d | Delete all lines containing "GUI". |
s/GUI//g | Delete all instances of "GUI", leaving the
remainder of each line intact. |
Substituting a zero-length string for another is equivalent
to deleting that string within a line of input. This leaves the
remainder of the line intact. Applying s/GUI//
to the line
The most important parts of any application are its GUI and sound effects |
results in
The most important parts of any application are its and sound effects |
A backslash forces the sed replacement
command to continue on to the next line. This has the effect of
using the newline at the end of the first
line as the replacement string.
This substitution replaces line-beginning spaces with a
newline. The net result is to replace paragraph indents with a
blank line between paragraphs.
An address range followed by one or more operations may require
open and closed curly brackets, with appropriate newlines.
/[0-9A-Za-z]/,/^$/{
/^$/d
} |
This deletes only the first of each set of consecutive blank
lines. That might be useful for single-spacing a text file,
but retaining the blank line(s) between paragraphs.
| A quick way to double-space a text file is sed G
filename. |
For illustrative examples of sed within shell scripts, see:
Example 33-1
Example 33-2
Example 12-3
Example A-2
Example 12-15
Example 12-24
Example A-12
Example A-17
Example 12-29
Example 10-9
Example 12-43
Example A-1
Example 12-13
Example 12-11
Example A-10
Example 17-12
Example 12-16
Example A-28
For a more extensive treatment of sed, check the appropriate
references in the Bibliography.