Besides using line numbers and address symbols
(
.
,
$
,
%
),
ex
(including the
ex
mode of
vi
, of course) can address lines by using
search patterns (
26.1
)
. For example:
:/
pattern
/d
Deletes the next line containing pattern .
:/
pattern
/+d
Deletes the line
below
the next line containing
pattern
. (You could also use
+1
instead of
+
alone.)
:/
pattern1
/,/
pattern2
/d
Deletes from the next line (after the current line) that contains pattern1 through the next following line that contains pattern2 .
:.,/
pattern
/m23
Takes text from current line (
.
) through the next line containing
pattern
and puts it after line 23.
Note that patterns are delimited by a slash both before and after .
If you make deletions by pattern with vi and ex , there is a difference in the way the two editors operate. Suppose you have in your file practice the lines:
With a screen editor you can scroll the page, move the cursor, d elete lines, insert characters and more, while seeing results of your edits as you make them. |
Keystrokes | Results |
---|---|
d/while
|
With a screen editor you can scroll the page, move the cursor, w hile seeing results of your edits as you make them. |
The vi delete to pattern command deletes from the cursor up to the word while but leaves the remainder of both lines. |
|
:.,/while/d
|
With a screen editor you can scroll the o f your edits as you make them. |
The ex command deletes the entire range of addressed lines; in this case both the current line and the line containing the pattern. All lines are deleted in their entirety. |
In
vi
you use a
/
(slash) to search for patterns of characters in your files. By contrast,
ex
has a
global command,
g
, that lets you search for a pattern and display all lines containing the pattern when it finds them. The command
:g!
does the opposite of
:g
. Use
:g!
(or its synonym
:v
) to search for all lines that do
not
contain
pattern
.
You can use the global command on all lines in the file, or you can use line addresses to limit a global search to specified lines or to a range of lines.
:g/
pattern
/
Finds (moves to) the last occurrence of pattern in the file.
:g/
pattern
/p
Finds and displays all lines in the file containing pattern .
:g!/
pattern
/nu
Finds and displays all lines in the file that don't contain pattern ; also displays line number for each line found.
:60,124g/
pattern
/p
Finds and displays any lines between lines 60 and 124 containing pattern .
g
can also be used for global replacements. For example, to search for all lines that begin with
WARNING:
and change the first word
not
on those lines to
NOT
:
\<..\> |
:g/^WARNING:/s/\<not\>/NOT/ |
---|
- from O'Reilly & Associates' Learning the vi Editor , Chapter 5