Библиотека сайта rus-linux.net
C.1. Sed
Sed is a non-interactive
[1]
stream 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.
[2]
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 [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 |
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 |
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. |
s/GUI//
to the line
|
|
s/^ */\ /g |
/[0-9A-Za-z]/,/^$/{ /^$/d } |
The usual delimiter that sed uses is /. However, sed allows other delimiters, such as %. This is useful when / is part of a replacement string, as in a file pathname. See Example 10-9 and Example 15-32. |
A quick way to double-space a text file is |
For illustrative examples of sed within shell scripts, see:
For a more extensive treatment of sed, check the appropriate references in the Bibliography.
Notes
[1] | Sed executes without user intervention. |
[2] | If no address range is specified, the default is all lines. |