|
|
In addition to the pattern space, sed provides a second buffer called the hold space. The contents of the pattern space can be copied to the hold space, then back again. No operations are performed directly on the hold space. sed provides a set of hold and get functions to handle these movements.
while (input file exists) { begin: search for phrase in pattern space if found print goto begin else while (input file exists) { append the next line to the pattern space save a copy of the pattern space discard the first line from the pattern space search for phrase in the pattern space if found print else restore the saved pattern space strip the newline out of the pattern space search for phrase in the pattern space if found print fi discard the first line in the pattern space fi } fi }The two crucial requirements for this procedure are that it should use a multiline pattern space, adding and deleting lines from it as the script rolls through the file; and that it must save a copy of the pattern space, make destructive changes to the original, and then retrieve the original copy.
The following is a shell script, not a sed script. It begins by invoking sed: all following commands are enclosed within single quotes. The script accepts two arguments: the string to search for (quoted, if it contains spaces or regular expressions) and the file to search.
sed ' /'"$1"'/b N h s/.*\n// /'"$1"'/b g s/ *\n/<Space>/ /'"$1"'/{ g b } g D' $2Note that <Space> denotes a literal space character at this point. The first line of sed commands searches for the target phrase; if it is present, sed branches (and goes back to the beginning of its script). See ``Flow-of-control functions'' for details of the b command.
If no match was made, the N function appends the next line to the pattern space; the current pattern space is then temporarily saved in the hold space (with the h function).
sed now removes the first line from the pattern space, then carries out another search for its target string. (If successful, it loops back to the start of the script.) If it still has not found the target string, it copies the saved version of the pattern space back in again and replaces the newline with a space; it searches for the target string again and, if it finds it, prints both lines.
If sed cannot find the target string in its pattern space,
it discards the first line in the space and then begins all over
again, working from the current line downwards.