正则表达式概述
(1)、正则表达式(regular expression)是一种字符模式,用于在查找过程中匹配指定的字符
(2)、在shell编程中,正则表达式被置于两个正斜杠之间。如:“/root/”就是一个正则表达式,它将匹配被查找的内容中任何位置出现root的部分
注:正则表达式最强大之处是对字符串的处理
正则表达式元字符
(1)、正则表达式元字符则由各种执行模式匹配操作的程序来解析
(2)、如:vi/vim、grep、sed、awk等程序。在这些程序中,可以通过正则表达式以某种方式界定模式,从而控制进行哪些操作
(3)、正则表达式元字符:
-
+:匹配前面的子表达式一次或多次。例如,'zo+'能匹配“zo”以及“zoo”,但不能匹配“z”(以z开头,o出现一次或多次)
-
?:匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”
元字符 | 功能 | 示例 | 匹配对象 |
---|---|---|---|
^ | 行首定位符 | /^love/ | 匹配所有以love开头的行 |
$ | 行尾定位符 | /love$/ | 匹配所有以love结尾的行 |
. | 匹配单个字符 | /l…e/ | 匹配包含一个l,后跟两个字符,再跟一个e的行 |
* | 匹配0或多个重复的位于星号前的字符 | /*love/ | 匹配包含跟在0个或多个空格后的包含love的行 |
[] | 匹配一组字符中任一个 | /[Ll]ove/ | 匹配包含love或Love的行 |
[x-y] | 匹配指定范围内的一个字符 | /[A-Z]ove/ | 匹配后面跟着ove的一个A至Z之间的字符 |
[^] | 匹配不在指定组内的字符 | /[^A-Z]/ | 匹配不在范围A至Z之间的任意一个字符 |
\ | 用来转义元字符 | /love\./ | 匹配包含love,后面跟一个句号。(未经转义的)句点通常匹配单个任意字符 |
\< | 词首定位符 | /\<love/ | 匹配包含以love开头的词的行(vi和grep支持) |
\> | 词尾定位符 | /love\>/ | 匹配包含以love结尾的词的行(vi和grep支持) |
\(…\) | 匹配稍后将要使用的字符的标签 | /\(love\) able\ler/ | 最多可以使用9个标签,模式中最左边的标签是第一个。例如,模式love被保存为标签1,用\1表示。左边这个例子中,查找串是一个lovable后跟lover的长串(sed、vi、grep支持) |
x\{m\}或x\{m,\}或x\{m,n\} | 字符x的重复出现:m次、至少m次、至少m次且不超过n次 | o\{5,10\} | 匹配包含5~10个连续的字母o的行(vi、grep支持) |
# 查询文件内容,输入/加查找条件,再输入/按回车即可
bc
ieddd
123deewf
90908kjknwejnf
iii
bcbc
~
~
~
~
/[^Aa]b/
grep概述
(1)、grep命令在文件中查找指定的正则表达式,并且打印所有包含该该正则表达式的行
(2)、grep命令在文件中查找某个字符模式,如果这个模式中包含空格,就必须用引号把它括起来。位于模式之后的所有单词被当做文件名
(3)、命令格式:grep 要查找的模式 文件名,比如在/etc/passwd文件中,查找包含root的行,命令为:grep root /etc/passwd
grep支持的正则表达式元字符
grep命令 | 命令执行的操作 |
---|---|
grep ‘\<Tom\>’ file | 打印包含词Tom的行 |
grep ‘Tom Savage’ file | 打印包含Tom Savage的行 |
grep ‘^Tommy’ file | 打印以Tommy开头的行 |
grep ‘\.bak$’ file | 打印以.bak结尾的行。单引号保护了美元符号($),使之不被shell解释 |
grep ‘[Pp]yramid’ * | 打印当前工作目录下所有文件中包含pyramid或Pyramid的行 |
grep ‘[A-Z]’ file | 打印所有至少包含一个大写字母的行 |
grep ‘[0-9]’ file | 打印所有至少包含一个数字的行 |
grep ‘[A-Z]…[0-9]’ file | 打印包含这样一个模式的行,该模式以大写字母开头、数字结尾、共有五个字符 |
grep -w ‘[tT]est’ file | 打印包含词Test或test的行 |
grep -s ‘Tom Savage’ file | 打印包含Tom Savage的行,但不打印找到的行。可以用于检查grep的退出状态 |
grep -v ‘Mary’ file | 打印所有不含Mary的行 |
grep -i ‘sam’ file | 打印所有包含sam的行,sam的各种大小写形式都可以(如:SAM、sam、Sam、sAm) |
man grep:查看grep的使用方法;-c打印行数
grep退出状态
(1)、grep执行后返回一个退出状态,以说明能否定位到要查找的模式
(2)、如果找到了就返回退出状态0表示成功
(3)、如果没有找到就返回1作为退出状态
(4)、当找不到要搜索的文件时,返回2
sed概述
(1)、sed是一个文件处理工具,以行为单位进行处理,可以将数据进行替换、删除、新增、选取等特定工作
(2)、sed命令行格式为:sed [-选项] ‘command’ 输入文本
sed原理
(1)、sed逐行处理文件或输入,并将输出结果发送到屏幕
(2)、例1:打印文件/etc/passwd中所有包含root的行
sed -n '/root/p' /etc/passwd
sed退出状态
sed不管是否找到指定模式,它的退出状态都是0,只有当命令存在语法错误时,sed的退出状态才不是0
sed定址功能
(1)、定址用于决定对那些行进行编辑,地址的形式可以是数字、正则表达式、或是二者的结合,如果没有指定地址,sed将处理输入文件中的所有行
(2)、例:删除文件file中的第1至3行
sed '1,3d' file
sed修改文件
如需要使用sed修改文件,可以使用以下方法:
-
把sed处理后的结果重定向到另外一个文件。如:sed ‘1,3d’ file>new_file
-
使用-i参数直接修改文件。如:sed -i ‘1,3d’ file
sed替换文件
(1)、sed替换文件内容,格式为:sed ‘s/string/new_string/’ filename
(2)、例1:将filename文件中,root替换为adb
sed 's/root/abc/' filename
(3)、例2:将root替换为abc,并修改文件
sed -i 's/root/abc/' filename
sed示例
命令 | 功能 |
---|---|
sed -n ‘/sentimental/p’ filex | 把文件filex中所有包含sentimental的行打印在屏幕上;filex的内容不会被改变;如果没有-n选项,所有包含sentimental的行都会被打印两次 |
sed ‘1,3d’ filex>newfilex | 删除文件filex的前3行,将修改结构保存到newfilex文件中 |
sed ‘/[Dd]anied/d’ filex | 删除包含Daniel或daniel的行 |
sed -n ‘15,20p’ filex | 只打印第15~20行 |
sed ‘1,10s/Montana/MT/g’ filex | 将第1~10行所有的Montana全局替换为MT |
sed ‘/March/\!d’ filex(csh) | 删除所有不含March的行 |
sed ‘/March/!d’ filex(sh) | 删除所有不含March的行。(只有在csh中才要用分斜杠来转义历史字符) |
sed ‘/report/s/5/8’ filex | 把所有包含report的行里出现的第一个5改为8 |
sed ‘/[Dd]anied/d’ filex | 删除包含Daniel或daniel的行 |