34.4 sed Addressing BasicsA sed command can specify zero, one, or two addresses. An address can be a line number, a line addressing symbol, or a regular expression ( 26.4 ) that describes a pattern.
To illustrate how addressing works, let's look at examples using the delete command, d . A script consisting of simply the d command and no address:
d produces no output since it deletes all lines. When a line number is supplied as an address, the command affects only that line. For instance, the following example deletes only the first line:
1d The line number refers to an internal line count maintained by sed . This counter is not reset for multiple input files. Thus, no matter how many files were specified as input, there is only one line 1 in the input stream.
Similarly, the input stream has only one last line.
It
can be specified using the addressing symbol,
$d
The
When a regular expression is supplied as an address, the command
affects only the lines matching that pattern.
The regular expression must be enclosed by slashes (
/^$/d deletes only blank lines. All other lines are passed through untouched. If you supply two addresses, then you specify a range of lines over which the command is executed. The following example shows how to delete all lines surrounded by a pair of macros, in this case, .TS and .TE, that mark a table as tbl ( 43.15 ) input:
/^\.TS/,/^\.TE/d It deletes all lines beginning with the line matched by the first pattern up to and including the line matched by the second pattern. Lines outside this range are not affected. If there is more than one table (another .TS/.TE pair after the first), those tables will also be deleted. The following command deletes from line 50 to the last line in the file:
50,$d You can mix a line address and a pattern address:
1,/^$/d This example deletes from the first line up to the first blank line, which, for instance, will delete a mail header from a mail message ( 1.33 ) that you have saved in a file. You can think of the first address as enabling the action and the second address as disabling it. sed has no way of looking ahead to determine if the second match will be made. The action will be applied to lines once the first match is made. The command will be applied to all subsequent lines until the second match is made. In the previous example, if the file did not contain a blank line, then all lines would be deleted. An exclamation mark following an address reverses the sense of the match. For instance, the following script deletes all lines except those inside tbl input:
/^\.TS/,/^\.TE/!d This script, in effect, extracts tbl input from a source file. (This can be handy for testing the format of tables.)
Curly braces (
/^\.TS/,/^\.TE/{ s/Caution/CAUTION/g /^\.sp 2p/d } - from O'Reilly & Associates' sed & awk |
|