在vi模式下,将tom和Tom替换成David,可以使用如下命令:
:1,$s/tom/David/g
:1,$s//<[Tt]om/>/David/g
含义:从文件第一行到文件末尾(1,$),用David替换单词tom和Tom.
g:表示全程执行该操作(即替换掉同一行中出现的所有指定模式).
正则表达式元字符/<和/>代表单词的开始和结束。
正则表达式元字符:
元字符 |
功能 |
示例 |
匹配对象 |
^ |
行首定位符 |
/^love/ |
匹配所有以love开头的行 |
$ |
行尾定位符 |
/love$/ |
匹配所有以love结尾的行 |
. |
匹配单个字符 |
/l..e/ |
匹配包含一个l,后跟两个字符,再跟一个e的行 |
* |
匹配0或多个重复的位于星号前的字符 |
/ *love/ |
匹配包含跟在零个或多个空格后的模式love的行 |
[] |
匹配一组字符中的任一个 |
/[Ll]ove/ |
匹配包含love或Love的行 |
[x-y] |
匹配指定范围内的一个字符 |
/[A-Z]ove/ |
匹配后面跟着ove的一个A至Z之间的字符 |
[^ ] |
匹配不在指定组内的字符 |
/[^A-Z]/ |
匹配不在范围A至Z之间的任意一个字符 |
/ |
用来转义元字符 |
/love/./ |
匹配包含love,后面跟一个句号。(未经转义的)句点通常匹配单个任意字符 |
许多使用RE元字符的UNIX/Linux程序都支持下面附加的元字符
/< |
词首定位符 |
//<love/ |
匹配包含以love开头的词的行(vi和grep支持) |
/> |
词尾定位符 |
/love/>/ |
匹配包含以love结尾的词的行(vi和grep支持) |
/(../) |
匹配稍后将要使用的字符的标签 |
//(love/)able/1er/ |
最多可以使用9个标签,模式中最左边的标签是第一个。例如,模式love被保存为标签1,用/1 表示。左边这个例子中,查找串是一个lovable后跟lover的长串(sed、vihe 和grep支持) |
x/{m/} 或 x/{m,/} 或 x/{m,n/} |
字符x的重复出现: M次、至少m、至少m次且不超过n次 |
o/{5,10/} |
匹配包含5~10个连续的字母o的行(vi和grep支持) |
GNU版本grep的正则表达式元字符基本集补充:
/w |
所有字母与数字,成为字符[a-zA-Z0-9_] |
l/w*e |
匹配一个l后跟零个或多个字符,最后接一个e |
/W |
所有字母与数字之外的字符,成为非字符[^a-zA-Z0-9_] |
love/W+ |
匹配love后跟一个或多个非字符(.,?等) |
/b |
词边界 |
/blove/b |
仅匹配love这个单词 |
egrep与grep -E使用的扩展集
+ |
匹配一个或多个前导字符 |
[a-z]+ove |
匹配一个或多个小写字母,后跟ove。如move,approve,love,behoove等 |
? |
匹配零个或一个前导字符 |
lo?ve |
匹配一个l后跟一个或零个字母o的模式,如love或lve |
a|b|c |
匹配a或b或c |
love|hate |
匹配其中的一个表达式,love或hate |
() |
组字符 |
love(able|rs) (ov)+ |
匹配loveable或lovers 匹配一个或多个连续的ov |
(..)(…) /1/2 |
标签匹配字符 |
/(love)ing |
寄存器中以标签标记的部分,以数字1记录。将来引用时,用/1重复该模式。最多可以使用9个标签,模式最左侧部分为第一个标签。例如,模式love保存在寄存器1中,将来以/1进行引用 |
括号字符类:
括号类 |
含义 |
[:alnum:] |
字母与数字两种字符 |
[:alpha:] |
字母字符 |
[:cntrl:] |
控制字符 |
[:digit:] |
数字字符 |
[:graph:] |
非空字符(不包含空格、控制字符等) |
[:lower:] |
小写字母 |
[:print:] |
与[:graph:]类似,但包含空格字符 |
[:punct:] |
标点字符 |
[:space:] |
所有的空白字符(换行符,空格符,制表符) |
[:upper:] |
大写字母 |
[:xdigit:] |
十六进制数字字符(0-9a-fA-F) |
例:grep '[[:space:]]/.[[:digit:]][[:space:]]' filename
查找filename中包含一个空格字符、一个数字字符和另一个空格字符的行。
所有变体(-G,-E和-F)均可用的GNU grep选项
选项 |
作用 |
-#- |
将匹配行前后#行的内容一同打印出来;也就是说,grep -2 pattern filename将导致grep打印匹配行及匹配行的前两行和后两行 |
-A #, --after-context=# |
打印匹配行后面#行的内容;也就是说,匹配行及它后面指定的#行内容 |
-B #, --before-context=# |
打印匹配行前面#行的内容;也就是说,匹配行及它前面指定的#行内容 |
-C #, --context=# |
等价于-2选项。打印匹配行的前两行和后两行 |
-V, --version |
打印grep版本信息,版本信息应当包含在所有的bug报告中 |
-a, --text, --binary-files=text |
将二进制文件当做文本文件处理 |
-b, --byte-offset |
在输出的每行前显示偏移字节数 |
-c, --count |
为每个输入文件打印成功匹配的行数。-v则打印一些未匹配的行数 |
-D action, --devices=action |
如果输入文件为一个设备,如套接字或管道。则action默认从该设备读,就如同读一个普通文件一样。如果action为skip,则该设备被忽略 |
-e PATTERN, --regexp=PATTERN |
使用字面PATTERN作为模式;这对保护以-开头的模式非常有帮助 |
-f FILE, --file=FILE |
从FILE中获得模式,每行一个。空文件包含0个模式,因此什么也不能匹配 |
--help-- |
显示有关grep命令行选项及错误报告地址的帮助信息,然后退出 |
-h, --no-filename |
当搜索多个文件时,禁止输出文件名前缀 |
-I, --ignore-case |
忽略模式和输入文件的大小写区别 |
-L, --files-without-match |
仅打印所有未能匹配模式的文件名 |
-l, --files-with-matches |
仅打印所有正确匹配模式的文件名 |
-m #, --max-count=# |
如果文件是标准输入或正规文件,在找到指定数量(#)的匹配行后停止读文件 |
-n, --line-number |
在匹配成功的输出行前加上行号作为前缀 |
-q, --quiet |
禁止正规输出。可用来替代-n |
-r, -R, --recursive, --directories=recurse |
对列出的目录,递归的读并处理这些目录中的所有文件;也就是指该目录下的所有目录 |
-s, --silent |
禁止显示文件不存在或文件不可读的错误信息 |
-v, --revert-match |
转换匹配性质,选择非匹配行 |
-w, --word-regexp |
仅选择包含词匹配的行。匹配词边界上包含字母、数字和下划线的字符串 |
-x, --line-regexp |
仅选择精确匹配整行的那些匹配 |
-y |
与已废除的-i同义 |
-U, --binary |
将文件作为二进制文件处理。仅有MS-DOS和MS-Windows支持该选项 |
-u, --unix-byte-offsets |
报告UNIX风格的字节偏移。这个选项仅在同时使用-b选项的情况下才有效;仅有MS-DOS和MS-Windows支持该选项 |
-Z, --null |
在文件名的末尾放上ASCII空字符以取代换行符 |
vi模式下,括在正斜杠之间的正则表达式是查找串,用来跟文本文件中的每一行进行匹配:
a. /^[A-Z]..$/ 查找文本中所有以大写字母开头、后跟两个任意字符,再跟一个换行符的行。
b. /^[A-Z][a-z ]*3[0-5]/ 查找所有以大写字母开头、后跟零个或多个小写字母或空格,再跟数字3和一个0~5之间的数字的行。
c. /[a-z]*/./ 查找包含跟在零个或多个小写字母后的句点的行。
d. /^ *[A-Z][a-z][a-z]$/ 查找以零个或多个空格开头(注意:制表符不算空格),后跟一个大写字母、两个小写字母和一个换行符的行。
e. /^[A-Za-z]*[^,][A-Za-z]*$/ 查找以零个或多个大/小写字母开头,后跟一个非逗号的字符,再跟零个或多个大/小写字母和一个换行符的行。
含义:从文件第一行到文件末尾(1,$),用David替换单词tom.