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/dDeletes the next line containing pattern.
:/pattern/+dDeletes the line below the next line containing
pattern.
(You could also use +1 instead of + alone.)
:/pattern1/,/pattern2/dDeletes from the next line (after the current line) that contains pattern1 through the next following line that contains pattern2.
:.,/pattern/m23Takes 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, delete 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, while 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 of 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/pFinds and displays all lines in the file containing pattern.
:g!/pattern/nuFinds and displays all lines in the file that don't contain pattern; also displays line number for each line found.
:60,124g/pattern/pFinds 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