Book HomeLearning the vi EditorSearch this book

6.2. Context-Sensitive Replacement

The simplest global replacements substitute one word (or a phrase) for another. If you have typed a file with several misspellings (editer for editor), you can do the global replacement:

:%s/editer/editor/g

This substitutes editor for every occurrence of editer throughout the file.

There is a second, slightly more complex syntax for global replacement. This syntax lets you search for a pattern, and then, once you find the line with the pattern, make a substitution on a string different from the pattern. You can think of this as context-sensitive replacement.

The syntax is as follows:

:g/pattern/s/old/new/g

The first g tells the command to operate on all lines of a file. pattern identifies the lines on which a substitution is to take place. On those lines containing pattern, ex is to substitute (s) for old the characters in new. The last g indicates that the substitution is to occur globally on that line.

For example, in this book, the SGML directives <keycap> and </keycap> place a box around ESC to show the ESCAPE key. You want ESC to be all in caps, but you don't want to change any instances of Escape that might be in the text. To change instances of Esc to ESC only when Esc is on a line that contains the <keycap> directive, you could enter:

:g/<keycap>/s/Esc/ESC/g

If the pattern being used to find the line is the same as the one you want to change, you don't have to repeat it. The command:

:g/string/s//new/g

would search for lines containing string and substitute for that same string.

Note that:

:g/editer/s//editor/g

has the same effect as:

:%s/editer/editor/g

You can save some typing by using the second form. It is also possible to combine the :g command with :d, :mo, :co and other ex commands besides :s. As we'll show, you can thus make global deletions, moves, and copies.



Library Navigation Links

Copyright © 2003 O'Reilly & Associates. All rights reserved.