Date: May 14, 1999
From the Dr. Strangelove, or How I Learned to Love the vi Editor file: Although difficult to learn, the vi editor is well worth the effort because the skill is portable between all Unix implementations. But more importantly, vi has powerful editing capabilities that can significantly enhance your productivity. This is the first in a series of tips that will illustrate some these capabilities.
There are several formats for searching/replacing test in vi. One relatively simple format is:
"range"s/old_string/new_string/
Where "range" indicates which lines to restrict the search/replace. The "range" can be absolute or relative line numbers, as well as search criteria. A few examples will illustrate the use of this format.
vi Command | Description |
---|---|
%s/red/blue/ | Replace first occurrence (in each line) of red with blue on all lines. The % is shorthand for all lines. Other shorthand notations include . (period) for the current line and $ for the last line in the file. |
%s/red/blue/g | Replace all occurrences of red with blue on all lines The g indicates all occurrences on a line. The g can be replaced with a number [1,2,...] to change only the n'th occurrence on each line. |
45,54s/red/blue/ | Replace first occurrence of red with blue on lines 45 through 54. |
.,+5s/red/blue/ | Replace first occurrence of red with blue starting at the current line for the next 5 lines. |
/abc/,/xyz/s/red/blue/ | Replace first occurrence of red with blue starting at at the next line containing abc through the first line containing xyz You could also use /xyz/-4 to indicate the line before xyz. |
The "range" concept applies to almost all vi commands. For example, 20,40dd will delete lines 20 through 40, .,$dd will delete the current line through the end of the file, and /abc/,/xyz/dd will delete the next line containing "abc" through the line containing "xyz."