vim正则表达式

vim正则表达式
元字符 说明
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
     如[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d 匹配阿拉伯数字,等同于[0-9]。
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
\x 匹配十六进制数字,等同于[0-9A-Fa-f]。
\X 匹配十六进制数字,等同于[^0-9A-Fa-f]。
\w 匹配单词字母,等同于[0-9A-Za-z_]。
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
\t 匹配<TAB>字符。
\s 匹配空白字符,等同于[ \t]。
\S 匹配非空白字符,等同于[^ \t]。
\a 所有的字母字符. 等同于[a-zA-Z]
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
 
表示数量的元字符
元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
\_. 匹配包含换行在内的所有字符
\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
\= 匹配一个可有可无的项
\_s 匹配空格或断行
\_[]
 
元字符 说明
\* 匹配 * 字符。
\. 匹配 . 字符。
\/ 匹配 / 字符。
\\ 匹配 \ 字符。
\[ 匹配 [ 字符。
 
表示位置的符号
元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾
 
替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
 
懒惰模式
\{-n,m} 与\{n,m}一样,尽可能少次数地重复
\{-} 匹配它前面的项一次或0次, 尽可能地少
\| "或"操作符
\& 并列
 
 
函数式
:s/替换字符串/\=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
 
与Perl正则表达式的区别 ?
元字符的区别
Vim语法 Perl语法 含义
\+       +       1-任意个
\?       ?       0-1
\{n,m}   {n,m}   n-m
\(和\)   (和)   分组
 
例如:
1,去掉所有的行尾空格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“___FCKpd___0rdquo;匹配行尾(使用“\___FCKpd___0rdquo;表示单纯的“___FCKpd___0rdquo;字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。(/<Space><Tab>)
2,去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。这回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
3,去掉所有的“//”注释:“:%s!\ s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
4,去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。
 
:g/^\s*$/d   删除只有空白的行
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1  将 data1 data2 修改为 data2 data1
:%s/\(\w\+\), \(\w\+\)/\2 \1/   将 Doe, John 修改为 John Doe
:%s/\<id\>/\=line(".")  将各行的 id 字符串替换为行号
:%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)   
   将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
排序 :/OB/+1,$!sort

vim使用疑问解答:

Q:vim如何支持ftp操作:
A:打开  :e ftp://192.168.10.76/abc.txt
   保存(如果不存在则创建)   :w ftp://192.168.10.76/abc.txt
   读取  :r ftp://192.168.10.76/abc.txt
   以上操作第一次打开时需要输入用户名和密码,以后就不用了,

Q:vi 处理多个文件编辑有什么法子?
A:1)  vi   file1 file2 file3...
         2)  假设你正在编辑 file1,那么用 :args <CTRL-R>;% file2 file3

Q:如何删除连续两行之间的回车符,使连续的两行成为一行?
A:Jx

Q:怎么将一定段落中的某个词替换成另一个词啊?
A:替换用 s/abc/def/ 这样,就可以把 abc 换成 def
         一个简便的方法是,先在 visual 模式下想办法选中你要操作的范围,然后再输入 s 命令就可以替换了。
         比如你要操作一个段落,可以先用 { 或者 [[ 挪到段落的开始处,然后再用 v 进入 visual 模式,
         然后再用 } 或者 ]] 挪到段落的结尾处,然后再输入 s 命令就可以实现你的目的了

Q:vim中光标在C函数和系统调用上时,按K进入man手册页,可是如果应用程序也有这个名字,比方说readlink,按下K就进入那个应用程序的man页了,
   如果我想取得在shell中man 2 readlink这样的效果,该怎么办
A:先按下2,然后shift+k,就进入系统调用man页了

Q:在vi中,怎么选中指定的几行,然后进行规整格式之类的命令?比如用V可以进入虚拟模式,然后上下就可以选中几行,然后用=规整格式。如果我想选中的行比较多,有没有比较好的办法呢?
A:V 打开"可视模式"(不是虚拟模式,虚拟是 virtual)后,可以有很多种办法移动光标的,不一定非得用 h j k l , 比如可以搜索定位, 也可以用 [[ ]] ][ [] } { 等段落定位的命令.
   v]]   v[[   v}  这样就可以选中一大块,而不用一行一行地选,还有 H L 这些都可以用.  详细请 help motion
   另外, vim 内置了很多以 a 打头的文本对象, 如 a{ 表示一个 {} 块, ap 表示一个段落等等。=a{ 就可以重排当前语法块.

Q:=a{命令重排后,是按2个TAB键进行缩进的?想让它按一个TAB键缩进,该如果处理?谢谢! 在Visual状态下,如何选择整个文件?
A:全选的命令是   ggVG     gg表示到第一行第一个字母,  V进入visual line  G则到文件尾。
   至于=a{重排,应该跟shiftwidth、softtabstop、tabstop、expandtab等设置有关。具体看你是怎么设置的。
   我的是把TAB全部设置成4个空格了。
   set tabstop=4
   set softtabstop=4
   set shiftwidth=4
   set expandtab
   set cindent
   set ai

Q:从win2k telnet到rh7.3使用vim编辑C文件时候,如何处理Ctrl+]呢?
A:vt100 不支持。用 ansi 终端,或者干脆改用 NetTerm 等软件,.

Q:vim支持语法高亮度显示,那么vim是否支持将语法高亮度显示的结果保存为一个html文档呢?
A::TOhtml

Q:vim如何把 “调用外部程序得到的输出” 转移到它自己一个新型的窗口里?比如我调用:!objdump -S %:p:r<cr>;怎样让VIM产生一个新的BUFFER或者窗口,捕获它的输出?
A::split +enew | r !ls
   split :分割窗口  split {+cmd} 表示打开一个新窗口,并在新窗口中执行 {cmd} 命令
   split +enew 就是打开一个新窗口,并且在其中执行 enew 这个命令
   enew  打开一个新的无名buffer  | 命令分割符 r read  !ls  执行外部命令

Q:在vim中如何 进行块复制 删除  等 块操作
A::v进入可视模式,hjkl选中要选中的块。y:复制、d:删除/剪切、p:粘贴
   v: visual mode//和普通的选择没区别
   V: visual line mode//在此模式下,选择的基本单位是行,即:要么就选一行,要么就什么都不选
   Ctrl-V: visual block mode//此模式下,可以选择一个块。

Q:能不能读入(解析)一个html文件呢?就是去掉html的的标记,象浏览器一样读入html??
A:vim 是个文本编辑器,不是 html 浏览器。  去掉标记  :%s/<[^>;]*>;//g

Q:写C的时候,如果要把一段注释掉,有什么方法?
A::vmap <F2>; :s/^/\/\//<CR>;  选中内容,按 F2。

Q:缩写
A::ab cu chinaunix   以后就可以自己写cu(空格 or 回车 or tab后)vi自动把cu替换成chinaunix

Q:在vi中,如果我不小心按错了键,跑到文件头或者文件尾了,怎么能快速回到刚才光标所在的位置?
A:vi 中不知道。 vim 中可以用 Ctrl+o(欧) 回来。

Q:如果我键入if,再回车,下一行就自动缩进,直到输入endif再和if对齐,vi中不知道怎么实现这个功能
A::set ai的命令来启动自动缩进。用:syntax on命令来启动语法着色。一般都是写在.exrc中每次自动执行的

Q:用什么快捷键可以在"插入模式"下删除光标到行尾的字符
A:^od$    ^o 表示同时按住 Ctrl 和 O 键。

Q:set autoindent 与 set cindent 区别
A:autoindent 就是自动缩进的意思,当你在输入状态用回车键插入一个新行,或者在 normal 状态用 o 或者 O 插入一个新行时,autoindent 会自动地将当前行的缩进拷贝到新行,也就是上面这位网友说的“自动对齐”,当然了,如果你在新行没有输入任何字符,那么这个缩进将自动删除。
   cindent 就不同了,它会按照 C 语言的语法,自动地调整缩进的长度,比如,当你输入了半条语句然后回车时,缩进会自动增加一个 TABSTOP 值,当你键入了一个右花括号时,会自动减少一个 TABSTOP 值。

Q:如何比较快速简单地用一段文字替换文章中的多处不同文字 如:用“为人民服务”来代替
A::%s/TNND\|TMD\|XXX\|FUCK/为人民服务

Q:用vi怎么copy一行,到另外的一个vi打开的文件中
A:Step1   yy   Step2   :vi file2    Step3   p

Q:怎么实现vim内,打一个括号如 "("自动补全另一个括号
A::iab ( ()

Q:如何删除所有的偶数行?
A:<ESC>;ggqajddq10000@a  假设你的文本有不到 20000 行,那么输入以上的命令就可以删除所有的偶数行。

Q:隔两行插入一个空行:
A:ggqajo<ESC>;jq1000@a

Q::set tabstop=4 按tab缩进4了..可是退出vi再进 还是8啊..怎么办?
A:你可以在用户目录下建文本.exrc,在里面写上set ts=4就可,下次进入时按tab就只有4格了

Q:怎么在vi里面更方便的删除一段内容?
A:首先在你需要考贝头,mark为ma,然后下移或上移到考贝尾,在命令模式输入  d'a 或者在ex模式输入:.,'ad<CR>;

Q:请问vim有配制文件吗?有的话放在哪里
A:根据你的系统类型及配置情况的不同,vim 配置文件的路径也会不同,所以具体请参照 :help vimrc

Q:怎样让 vim 在打开不同文件的时候在开头写入不同的内容。 例如在打开一个后缀名为 cpp 的空文件的时候写入
   #include <iostream>;
   using namespace std;   
A:[code] autocmd BufNewFile *.cpp exec append(0,"#include <iostream>;") | exec append(1,"using namespace std;") | exec ':$' [/code]

Q:如何实现一下删除多行,或是整个文件中的所有行
A::%d   ggdG

Q:源代码比较混乱,有没有办法格式化呢?
A:gg=G

Q:使用:args可以查看你正在编辑哪个文件,但是我在C语言环境下,使用Ctrl-]跳转到函数定义地方以后,怎么知道我现在位于哪个文件呢?
A:Ctrl+g

posted @ 2011-04-29 13:48  ACE封印  Views(7521)  Comments(2Edit  收藏  举报