Using Search Patterns and Global Commands
Besides using line numbers and address symbols (, $, %), ex (including the ex mode of vi, of course) can address lines by using search patterns (). 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
+1instead 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, 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. |
Global Searches
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/ |
|---|
- LL from Anonymous' vi Editor, Chapter 5