Saturday, January 29, 2011

Vim - The Editor ( Substitution )

Definition: Vim stands for 'Vi Improved'. Vi is one of the most popular and powerful editors in the Unix world. Vi is an abbreviation for "Visual" editor. One of the first editors was a line editor called 'ed' (and 'ex'). Vim supports color syntax highlighting of program code and also emphasises text using different fonts like normal, bold or italics. A color editor like Vim can improve the productivity of programmers by 2 to 3 times!!

Substitution in Vi :
:1,10s/old/new/ --> replaces occurrences of "old" between line 1 to
10 by "new".
:.,$s/old/new/ --> replaces occurrences of "old" from current line
to end of file by "new".
:1,.s/old/new/ --> replaces occurrences of "old" from beginning of
file to current line by "new".
:.,+5s/old/new/ , :-5,+5s/old/new/ are all valid substitutions.
:+5,-5s/old/new/ --> invalid substitution as invalid range.
%s/old/new/ --> replace occurrences of "old" to "new".

all the examples so far replaces only the first occurrence of "old"
in each line to "new" it skips all other occurrences after the first.
to replace it globally "g" should be appended after the command like
%s/old/new/g, :1,10s/old/new/g and so on.

Another useful option flag is the confirm flag, a c at the end of the
command. The confirm flag will display the line to be changed with a
pointer to the text to be changed and will wait for you to press "y"
or "n" to signify that you do or do not wish to go ahead with the

try :%s/old/new/gc

:g/Gaurav/s/Kumr/Kumar/g --> replace all occurrences of "Kumr" by
"Kumar" in lines containing "Gaurav". if the line doesn't contain
"Gaurav", "Kumr" will not be replaced by "Kumar".

:.,$s//new/g --> if search string is not specified it uses the
last search string which is "old" here.

Any character can be used as a delimiter although the forward slash
has become the accepted standard character. The following commands
all do the same thing.


The substitute command picks up the first character after the s and assumes that it is the delimiter and uses it through the rest of the command. The character used as a delimiter cannot then appear in the search text or the replacement text as it will be seen by the substitute command as a delimiter. You should use a different delimiter when you are actually doing a search that includes looking for the delimiter character. The following command replaces the forward slash with the word "per." It uses the at sign (@) as the delimiter since the slash is part of the search text.

:%s@/@ per @g

:%s/^V^M//g --> to remove all Ctrl+M characters in a file.
(please read above as "%s/Ctrl+V Ctrl+M//g" without spaces)

In UNIX, you can escape a control character by preceding it
with a CONTROL-V.

Regular Expressions:

. -> matches any character excluding \n.
* -> matches zero or more occurrences of character that immediately
precedes it.It can also follow a . or a range in bracket [a-d].
^ -> expression should be found at the beginning of the line.
$ -> expression should be found towards the end of the line.
/ -> escape character.
\( \) --> Saves the pattern enclosed between \( and \) in a special
holding space or "hold buffer". Up to nine patterns can be
saved in this way on a single line.
-> changes "oldold" into "newnew".

~ --> Matches whatever regular expression was used in the last search.

:%s/~/sue/gc : Substitute last replacement string
:%s/\r//g : removing ^M
:%s/\s*\r\?$// : remove trailing spaces && DOS returns
:%s/^\n\{3}// : delete 3 consecutive empty lines
:%s/^\n\+/\r/ : remove all empty lines
:'a,'bg/match/s/old/new/gc : substitute a range of marked lines.
:'a,'bs/cat\(s\)*/rat\1/gc : substitute singular and plurals both.

No comments:

Post a Comment