vim编辑器替换功能详解

转载自http://www.uhdesk.com/?p=29

he 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

Find each occurrence of ‘foo’ (in all lines), and replace it with ‘bar’.

:s/foo/bar/g

Find each occurrence of ‘foo’ (in the current line only), and replace it with ‘bar’.

:%s/foo/bar/gc

Change each ‘foo’ to ‘bar’, but ask for confirmation first.

:%s/\<foo\>/bar/gc

Change only whole words exactly matching ‘foo’ to ‘bar‘; ask for confirmation.

:%s/foo/bar/gci

Change each ‘foo’ (case insensitive) to ‘bar‘; ask for confirmation.

This may be wanted after using :set noignorecase to make searches case sensitive (the default).

:%s/foo/bar/gcI

Change each ‘foo’ (case sensitive) to ‘bar‘; ask for confirmation.

This may be wanted after using :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.

DetailsEdit

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‘.

Note: As of Vim 7.3, substitutions applied to a range defined by marks or a visual selection (which uses a special type of marks ‘< and ‘>) are not bounded by the column position of the marks by default. Instead, Vim applies the substitution to the entire line
on which each mark appears unless the \%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

\n is newline, \r is CR (carriage return = Ctrl-M = ^M)

\{#\} 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/

Using the current word or registersEdit

:%s//bar/g

Replace each match of the last search pattern with ‘bar’.

For example, you might first place the cursor on the word foo then press * to search for that word.

The above substitute would then change all words exactly matching ‘foo’ to ‘bar’.

:%s/foo//g

Replace each occurrence of ‘foo’ with the word under the cursor.

means that you press Ctrl-R then Ctrl-W.

The word under the cursor will be inserted as though you typed it.

:%s/foo//g

Replace each occurrence of ‘foo’ with the WORD under the cursor (delimited by whitespace).

means that you press Ctrl-R then Ctrl-A.

The WORD under the cursor will be inserted as though you typed it.

:%s/foo/a/g

Replace each occurrence of ‘foo’ with the contents of register ‘a’.

a means that you press Ctrl-R then a.

The contents of register ‘a’ will be inserted as though you typed it.

:%s/foo/\[email protected]/g

Replace each occurrence of ‘foo’ with the contents of register ‘a’.

\[email protected] is a reference to register ‘a’.

The contents of register ‘a’ is not shown in the command. This is useful if the register contains many lines of text.

:%s////g

Replace each match of the last search pattern with the / register (the last search pattern).

After pressing Ctrl-R then / 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/*/bar/g

Replace all occurrences of the text in the system clipboard (in the * register) with ‘bar’ (see next example if multiline).

On some systems, selecting text (in Vim or another application) is all that is required to place that text in the * register.

:%s/a/bar/g

Replace all occurrences of the text in register ‘a’ with ‘bar’.

a means that you press Ctrl-R then a. The contents of register ‘a’ will be inserted as though you typed it.

Any newlines in register ‘a’ are inserted as ^M and are not found.

The search works if each ^M is manually replaced with ‘\n’ (two characters: backslash, ‘n’).

This replacement can be performed while you type the command:

:%s/=substitute(@a,"\n",‘\\n‘,‘g‘)/bar/g

The “\n” (double quotes) represents the single character newline; the ‘\\n’ (single quotes) represents two backslashes followed by ‘n’.

The substitute() function is evaluated by the = (Ctrl-R =) expression register; it replaces each newline with a single backslash followed by ‘n’.

The indicates that you press Enter to finish the = expression.

See Paste registers in search or colon commands instead of using the clipboard.

Additional examplesEdit

:%s/foo/bar/

On each line, replace the first occurrence of “foo” with “bar”.

:%s/.*\zsfoo/bar/

On each line, replace the last occurrence of “foo” with “bar”.

:%s/\<foo\>//g

On each line, delete all occurrences of the whole word “foo”.

:%s/\<foo\>.*//

On each line, delete the whole word “foo” and all following text (to end of line).

:%s/\<foo\>.\{5}//

On each line, delete the first occurrence of the whole word “foo” and the following five characters.

:%s/\<foo\>\zs.*//

On each line, delete all text following the whole word “foo” (to end of line).

:%s/.*\<foo\>//

On each line, delete the whole word “foo” and all preceding text (from beginning of line).

:%s/.*\ze\<foo\>//

On each line, delete all the text preceding the whole word “foo” (from beginning of line).

:%s/.*\(\<foo\>\).*/\1/

On each line, delete all the text preceding and following the whole word “foo”.

:s/^\(\w\)/\u\1/

If the first character at the beginning of the current line is lowercase, switch it to uppercase using \u (see switching case of characters).

:%s/\(.*\n\)\{5\}/&\r/

Insert a blank line every 5 lines.

The pattern searches for \(.*\n\) (any line including its line ending) repeated five times (\{5\}).

The replacement is & (the text that was found), followed by \r (newline).

:%s/\<foo\(\a*\)\>/\=len(add(list, submatch(1)))?submatch(0):submatch(0)/g

Get a list of search results. (the list must exist)

Sets the modified flag, because of the replacement, but the content is unchanged.

Note: With a recent enough Vim (version 7.3.627 or higher), you can simplify this to:

:%s/\<foo\(\a*\)\>/\=add(list, submatch(1))/gn

This has the advantage, that the buffer won’t be marked modified and no extra undo state is created. The expression in the replacement part is executed in the sandbox and not allowed to modify the buffer.

Special casesEdit

For substituting patterns with a corresponding case-sensitive text, Michael Geddes’s keepcase plugin can be used, e.g.:

:%SubstituteCase/\cHello/goodBye/g

Substitute ‘Hello hello helLo HELLO’ by ‘Goodbye goodbye goodBye GOODBYE’

For 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).” @@”/g

Useful when we want to strip some blocks from a patch, without patch having to complain about offset differences.

时间: 2024-11-06 14:14:25

vim编辑器替换功能详解的相关文章

3、grep,vim,压缩功能详解

上午命 令 less abc.txt 查看abc文件 可以上翻下翻 ls --help | more (用More方式查看该文件) cat abc.txt 查看abc文件 head -5 abc.txt  查看前五行 tail -5 abc.txt  查看尾五行 head -10 /etc/passwd | tail -4   查看六到十行文件 tail -f abc.txt 动态查看文件 more abc.txt 查看abc.txt 按Q退出 按回车显示下一行 回空格往下翻页 按b往上翻页 l

Linux中的上古神器vim编辑器的使用详解

vim 文本编辑器 vi 简介 vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器.Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能. vi编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用vi编辑器就必须熟练掌握着两种模式的切换.默认情况下,打开vi编辑器后自动进入命令模式.从编辑模式切换到命令模式使用"esc"键,从命令模式切

Vim 命令常用功能详解

Vim编辑器 文本编辑器 , 字处理器ASCIIvi:Visual Interface vim :VI iMproved 全屏编辑器,模式化编辑器vim 模式:编辑模式(命令模式)输入模式末行模式 模式转换:编辑模式-->输入模式: i : 在当前光标所在的字符的前面,转为输入模式 a : 在当前光标所在的字符的后面,转为输入模式 o :在当前光标所在行的下方,新建一行,并转为输入模式 I : 在当前光标所在行的行首,转为输入模式 A : 在当前光标所在行的行尾,转为输入模式 O : 在当前光标

vi和vim区别及命令详解

vi和vim都是Linux中的编辑器,不同的是vim比较高级,可以视为vi的升级版本.vi使用于文本编辑,但是vim更适用于coding.     现将vim的命令行收集于下: vi有3个模式:插入模式.命令模式.低行模式. 插入模式:在此模式下可以输入字符,按ESC将回到命令模式.     命令模式:可以移动光标.删除字符等.     低行模式:可以保存文件.退出vi.设置vi.查找等功能(低行模式也可以看作是命令模式里的). 一.打开文件.保存.关闭文件(vi命令模式下使用) vi file

[转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解

基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解 不明觉厉 只要是人做的东西 就会有bug 就会有安全问题 就看发现bug 或者是发现安全问题 有没有收益了 会用linux的都是比较熟悉操作系统等概念的 不容易被钓鱼 反过来 很多用windows的能力会很差, 所以 windows上面显的更加脆弱. 这就好比开丰田车出事故的人 要比开众泰出事故的人要多很多一个道理. 众泰开的少 而且大家都可能会修车了.. https://www.freebuf.com/vuls/205516.h

PHP5.2至5.6的新增功能详解

截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注].因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数

.Net的Oracle数据库ORM控件dotConnect for Oracle下载地址及功能详解

原文来自龙博方案网http://www.fanganwang.com/product/1330转载请注明出处 dotConnect for Oracle完全基于ADO.NET方法,因此您完全可以采用标准ADO.NET数据提供的方法来使用它.是一款为Microsoft .NET Framework提供直接Oracle数据库连接的数据发生器控件. 具体功能: 无需Oracle客户端,采用直接模式提供数据库连接 100%代码管理 具有高表现性能 支持Oracle 10g, 9i, 8i 和 8.0,包

PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

PHP 5.2.5.3.5.4.5.5.5.6 对比以及功能详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5.3 [注]. 因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣. 本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征. PHP5.2 以前:autoload, PDO 和 MySQLi, 类型

[转]notepad++正则表达式替换字符串详解

原文:http://blog.csdn.net/qinboecjtu/article/details/6035028 正则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它 能很好提高工作效率. EditPlus的查找,替换,文件中查找支持以下的正则表达式: 表达式 说明 /t 制表符. /n 新行. . 匹配任意字符. | 匹配表达式左边和右边的字符. 例如, "ab|bc" 匹配 "