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