前面简单的介绍过搜索命令,这里简单的回顾一下。
一、搜索
快捷键 功能 记忆方式
--------------------------------------------------------------
/search_string 从当前行向下查找“search_string”
?search_string 从当前行向上查找“search_string”
n 继续查找下一个“search_string”
N 继续查找上一个“search_string”
/serrch_string\c 忽略大小写
--------------------------------------------------------------
前面也简单的介绍过,命令模式下使用大小写的:r,s的替换功能,
这里也就不在赘述了。
二、范围
下面详细介绍下,命令行模式下的搜索和替换功能。
说道搜索和替换,那么不可回避的,就是”范围“的概念。
所谓范围,在命令行中,常以,分隔,比如3,7 那么表示
下面跟着的操作,只针对第三行至第七行之间的文本。
怎么看行号,前面说过:set no,显示所有行号,或者ctrl+g,现实当前
行号,这里也是回顾一下。
下面列出常用的范围描述:
命令 功能 记忆方式
--------------------------------------------------------------
:n,m 从n行至m行
:. 当前行
:$ 最后行
:'c 标记为c的行
:g/pattern/ 所有匹配pattern的行
--------------------------------------------------------------
三、替换
下面说一下替换功能,:s命令可以完成搜索以及替换功能,替换命令
通常需要限定文本范围或者跟随:g命令,下面列出常用的替换命令。
命令 功能 记忆方式
--------------------------------------------------------------
:s/p/q/g 搜索模式p,并全部替换为q
:s/p/q/ 搜索模式p,并将首次出现p替换为q
:s/p/q/c 搜索模式p,并确认是否替换为q
:s/p/q/g 将当前行所有p用q代替
:n,ms/p/q/g 将n行至m行之间的内容p用q代替
:g/p/s//q/g 将文件中所有p用q代替
--------------------------------------------------------------
四、crlf的来历
下面说一个有趣的小知识,关于回车换行符的。
DOS, Mac 和Unix格式的文件各有不同,
回想计算机的史前史,那时的打字机使用两个字符来开始一个新行。
首先是一个字符命令使打印头移回开始位置(回车,<CR>),然后另一个字
符命令控制向前进纸一行(进纸,<LF>).
在计算机诞生之初,存储设备十分昂贵。于是有人就提出没有必要
用两个字符来表示一行的结束。UNIX一族决定只用进纸一个字符<Line
Feed>来表示行尾。来自苹果阵营的人则把回车<CR>作为换行的标
准。MS-DOS(和微软的Windows)仍然决定沿用古老的回车换行<CR><LF>传
统。
这样就导致了,三种不同的古怪标准,写vb程序,常用到的一个vbcrlf常量,
就是这么来的。
dos unix mac
------------------------------------------------------------
<CR><LF> <LF> <CR>
------------------------------------------------------------
所以,如果把dos下编辑的文本拿到unix下用vim打开,就会在每一行的行尾,
出现一个^M的标记,当然,可以用tr命令行,或者dos2unix命令直接转换,
但是应用上面说到的vim搜索和替换命令,也可以做到。
具体怎么做,爷懒得试了,谢谢。
五、正则表达式
正则表达式,伟光正的描述,是一种用来描述文本模式的特殊语法。
土点的说法,就是一种牛逼立体的匹配字符串的语法,
也可以用来区分普通程序猿和文艺程序猿。
曾经专门买了一本专门讨论这个主题的书来看,结果是头昏脑胀。
用了一段时间,发现其实,真是很简单的东西,
只要记住下面的这些内容,就会玩转正则表达式,当然,
熟能生巧是必须的。
这个玩意儿,在c井中偶尔会用到,
但是在linux世界中则是无处不在。
譬如:find grep awk sed sort uniq cut等等命令。
vim中,也是经常用来搜索匹配替换字符串,
不会的时候,往往遇到一些稍微复杂的匹配条件,
就只能干瞪眼了,可学会了以后,那真是受益无穷,终生无憾。
实在是居家旅行、杀人放火的无上利器呀~~~~~哦也~~~~
要说练会正则表达式,精髓中的精髓,就是记住一点:
所谓正则表达式,无非就是普通字符,以及特殊字符(也叫元字符/,*,?)
的排列组合而已,所以牢记那些是元字符及其含义,就是重中之重,
当然其他的就是普通字符。
正则表达式,一句话表述清楚,就是使用元字符与普通字符的排列组合
形成的字符串,表示出你要匹配的内容。。。哦,说清楚了么。。。
基本元字符及其含义
字符 含义
------------------------------------------------------------
^ 只匹配行首
$ 只匹配行尾
| x|y匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。
'(z|f)ood' 则匹配 "zood" 或 "food"。
\<,\> 匹配词首和词尾
\(...\) 正则表达式分组
* 匹配0个或多个字符
[] 只匹配[]内字符。可以使一个单字符,也可以是字符序列。
可以使用-表示[]内字符序列范围,如[1-5]=[12345]
[^pattern] 当"^"符号当直接靠着"[",意指否定或不匹配括号"[]"里内容
{} 匹配括号内的字符串,用,分隔,譬如:{abc,bcd},
\ 屏蔽一个元字符的特殊含义,既然有了元字符,那么\就非常重要。
. 只匹配任意单字符
pattern\{n\} 只用来匹配前面pattern出现的次数。n为次数。
pattern\{n\} 含义同上,但次数最少为n。
pattern\{n,m\} 含义同上,但pattern出现次数在n与m之间。
------------------------------------------------------------
上面了列出的只是常用的方式,记住了这些,估计99%的应用都可以满足了。
学些正则表达式,第一牢记元字符以及语法,第二多看几个例子,无他。
例子以后有时间会慢慢累加,下面列两个常用的匹配
ip地址以及日期的正则表达式实例:
匹配ip地址:
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}
匹配日期,日期格式dd-mm-yyyy
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}
现在看起来,简单吧,无非是元字符、普通字符组合而已,
需要保持元字符原有含义的,就用转义符标记。
还有一类蛋疼的正则表达式类,列出来供参考,
我觉得没什么用,在这里介绍,只是为了以后玩意见到,
有什么文艺程序猿这样写,不会看不懂而已。
类 等价的正则表达式
--------------------------------------------------
[[:upper:]] [A-Z]
[[:alnum:]] [0-9a-zA-Z]
[[:lower:]] [a-z]
[[:space:]] 空格或tab键
[[:digit:]] [0-9]
[[:alpha:]] [a-zA-Z]
--------------------------------------------------
好了,就到这里,到这里吧。。。
转载于:https://www.cnblogs.com/jinshoucai/archive/2011/11/09/2242436.html