





















Vim provides the :s (substitute) command for search and replace; this tip shows examples of how to substitute. On some systems, gvim has Find and Replace on the Edit menu (:help :promptrepl), however it is easier to use the :s command due to its command line history and ability to insert text (for example, the word under the cursor) into the search or replace fields.
The :substitute command searches for a text pattern, and replaces it with a text string. There are many options, but these are what you probably want:
:s/foo/bar/g:%s/foo/bar/g:%s/foo/bar/gc:%s/\<foo\>/bar/gc:%s/foo/bar/gcii flag) to 'bar'; ask for confirmation.:%s/foo\c/bar/gc is the same because \c makes the search case insensitive.:set noignorecase to make searches case sensitive (the default).:%s/foo/bar/gcII flag) to 'bar'; ask for confirmation.:%s/foo\C/bar/gc is the same because \C makes the search case sensitive.:set ignorecase to make searches case insensitive.The g flag means global – each occurrence in the line is changed, rather than just the first. This tip assumes the default setting for the 'gdefault' and 'edcompatible' option (off), which requires that the g flag be included in %s///g to perform a global substitute. Using :set gdefault creates confusion because then %s/// is global, whereas %s///g is not (that is, g reverses its meaning).
When using the c flag, you need to confirm for each match what to do. Vim will output something like: replace with foobar (y/n/a/q/l/^E/^Y)? (where foobar is the replacement part of the :s/.../.../ command). You can type y which means to substitute this match, n to skip this match, a to substitute this and all remaining matches ("all" remaining matches), q to quit the command, l to substitute this match and quit (think of "last"), ^E to scroll the screen up by holding the Ctrl key and pressing E and ^Y to scroll the screen down by holding the Ctrl key and pressing Y. However, the last two choices are only available, if your Vim is a normal, big or huge built or the insert_expand feature was enabled at compile time (look for +insert_expand in the output of :version).
Also when using the c flag, Vim will jump to the first match it finds starting from the top of the buffer and prompt you for confirmation to perform replacement on that match. Vim applies the IncSearch highlight group to the matched text to give you a visual cue as to which match it is operating on (set to reverse by default for all three term types as of Vim 7.3). Additionally, if more than one match is found and you have search highlighting enabled with :set hlsearch, Vim highlights the remaining matches with the Search highlight group. If you do use search highlighting, you should make sure that these two highlight groups are visually distinct or you won't be able to easily tell which match Vim is prompting you to substitute.
Search range:
:s/foo/bar/g |
Change each 'foo' to 'bar' in the current line. |
:%s/foo/bar/g |
Change each 'foo' to 'bar' in all the lines. |
:5,12s/foo/bar/g |
Change each 'foo' to 'bar' for all lines from line 5 to line 12 (inclusive). |
:'a,'bs/foo/bar/g |
Change each 'foo' to 'bar' for all lines from mark a to mark b inclusive (see Note below). |
:'<,'>s/foo/bar/g |
When compiled with +visual, change each 'foo' to 'bar' for all lines within a visual selection. Vim automatically appends the visual selection range ('<,'>) for any ex command when you select an area and enter :. Also, see Note below. |
:.,$s/foo/bar/g |
Change each 'foo' to 'bar' for all lines from the current line (.) to the last line ($) inclusive. |
:.,+2s/foo/bar/g |
Change each 'foo' to 'bar' for the current line (.) and the two next lines (+2). |
:g/^baz/s/foo/bar/g |
Change each 'foo' to 'bar' in each line starting with 'baz'. |
\%V atom is used in the pattern like: :'<,'>s/\%Vfoo/bar/g.
When searching:
., *, \, [, ^, and $ are metacharacters.+, ?, |, &, {, (, and ) must be escaped to use their special function.\/ is / (use backslash + forward slash to search for forward slash)\t is tab, \s is whitespace (space or tab)\n is newline, \r is CR (carriage return = Ctrl-M = ^M)[, everything until the next closing ] specifies a /collection. Character ranges can be represented with a -; for example a letter a, b, c, or the number 1 can be matched with [1a-c]. Negate the collection with [^ instead of [; for example [^1a-c] matches any character except a, b, c, or 1.\{#\} is used for repetition. /foo.\{2\} will match foo and the two following characters. The \ is not required on the closing } so /foo.\{2} will do the same thing.\(foo\) makes a backreference to foo. Parenthesis without escapes are literally matched. Here the \ is required for the closing \).When replacing:
\r is newline, \n is a null byte (0x00).\& is ampersand (& is the text that matches the search pattern).\0 inserts the text matched by the entire pattern\1 inserts the text of the first backreference. \2 inserts the second backreference, and so on.You can use other delimiters with substitute:
:s#http://www.example.com/index.html#http://example.com/#Save typing by using \zs and \ze to set the start and end of a pattern. For example, instead of:
:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/Use:
:s/Copyright \zs2007\ze All Rights Reserved/2008/:%s//bar/gfoo then press * to search for that word.:%s/foo/<c-r><c-w>/g<c-r><c-w> means that you press Ctrl-R then Ctrl-W.:%s/foo/<c-r><c-a>/g<c-r><c-a> means that you press Ctrl-R then Ctrl-A.:%s/foo/<c-r>a/g<c-r>a means that you press Ctrl-R then a.:%s/foo/<c-r>0/gyi( which copies the text inside parentheses around the cursor, and y$ which copies the text from the cursor to the end of the line. After a yank command which did not specify a destination register, the copied text can be entered by pressing Ctrl-R then 0.:%s/foo/\=@a/g\=@a is a reference to register 'a'.:%s//<c-r>//g/ register (the last search pattern)./ to insert the last search pattern (and before pressing Enter to perform the command), you could edit the text to make any required change.:%s/<c-r>*/bar/g* register) with 'bar' (see next example if multiline).* register.:%s/<c-r>a/bar/g<c-r>a means that you press Ctrl-R then a. The contents of register 'a' will be inserted as though you typed it.^M and are not found.^M is manually replaced with '\n' (two characters: backslash, 'n').:%s/<c-r>=substitute(@a,"\n",'\\n','g')<CR>/bar/g"\n" (double quotes) represents the single character newline; the '\\n' (single quotes) represents two backslashes followed by 'n'.substitute() function is evaluated by the <c-r>= (Ctrl-R =) expression register; it replaces each newline with a single backslash followed by 'n'.<CR> indicates that you press Enter to finish the = expression.:%s/<c-r>0/bar/gSee Paste registers in search or colon commands instead of using the clipboard.
:%s/foo/bar/:%s/.*\zsfoo/bar/:%s/\<foo\>//g:%s/\<foo\>.*//:%s/\<foo\>.\{5}//:%s/\<foo\>\zs.*//:%s/.*\<foo\>//:%s/.*\ze\<foo\>//:%s/.*\(\<foo\>\).*/\1/:%s/\<foo\(bar\)\@!/toto/g:s/^\(\w\)/\u\1/\u (see switching case of characters).:%s/\(.*\n\)\{5\}/&\r/\(.*\n\) (any line including its line ending) repeated five times (\{5\}).& (the text that was found), followed by \r (newline).:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/gmodified flag, because of the replacement, but the content is unchanged.:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gnFor substituting patterns with corresponding case-sensitive text, Michael Geddes's keepcase plugin can be used, e.g.:
:%SubstituteCase/\cHello/goodBye/gFor changing the offsets in a patch file (line number of a block), this little snippet can be used:
s/^@@ -\(\d\+\),\(\d\+\) +\(\d\+\),\(\d\+\) @@$/\="@@ -".eval(submatch(1)+offsetdiff).",".submatch(2)." +".eval(submatch(3)+offsetdiff).",".submatch(4)." @@"/gUseful when we want to strip some blocks from a patch, without patch having to complain about offset differences.
/ or for a word using *.cgn (change the next search hit) then immediately type the replacement. Press Esc to finish.n) and press . to repeat the last change. TO DO
The large "see also" section may be useful to readers. We need to merge some of the related tips (but don't make the result too complex). I included the tip numbers to help editors keep track.
Want a short section mentioning that simple substitutes are often best handled by searching then manually changing (and pressing . to repeat the last change). Additionally, you can decide how to change each instance. See Copy or change search hit for a technique where you can press n to find the next instance, then type cs to change the search hit to whatever.
Has there been a change recently with how %s works? Somehow i can use both <c-r> and \=@ as replacers, but I can't use them as searches and replacements.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。