1. 基础的正则表达式
1.1 正则表达式与通配符
(1)正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。
(2)通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
1.2 基础正则表达式
元字符 |
作用 |
* |
前一个字符匹配0次或任意多次(是前一个字符,这与bash的通配符不同) |
. |
匹配除了换行符外任意一个字符 |
^ |
匹配行首。例如:^hello会匹配以hello开头的行 |
$ |
匹配行尾。例如:hello$会匹配以hello结尾的行 |
[] |
匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一个数字,[a-z][0-9]匹配小写字母和一位数字构成的两位字符。 |
[^] |
匹配除中括号中字符以外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字母。 |
\ |
转义符。用于将特殊殊号的含义取消。 |
\{n\} |
表示前面的字符恰好出现n次。实际上为{n},其中{}要转义为原来的含义。 |
\{n,\} |
表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字 |
\{n,m\} |
表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\}匹配6到8位的小写字母。 |
【编程实验】正则表达式
//测试文本(test_rule.txt)
Mr. Santa Claus said: he was the honest man in HorzionStudio 123 depise him. But since Mr. Rolling Stone came, he never saaaid those words. 55555nice! because,actuaaaaly, Mr. Rolling Stone is the most honest man! Later, Mr. Santa Claus soid his hot body.
(1)“*”表示前一个字符匹配0次,或任意多次。
①#grep "a*" test_rule.txt //匹配所有内容,包括空白行。(理解:*取0时,表示空白行或者可理解为在行中不出现a的行。*≥1时表示a出现1次或多次的行。)
②#grep "aa*" test_rule.txt //至少包含有一个a的行。
③#grep "aaa*" test_rule.txt //至少包含两个连续a的字符串
④#grep "aaaa*" test_rule.txt //至少包含四个连续a的字符串。
(2)“.”匹配除了换行符外任意一个字符
①# grep "s..d" test_rule.txt //匹配在s和d之间一定有两个字符的字符串。
②# grep "s.*d" test_rule.txt //匹配在s和d字母之间有任意字符。
③# grep ".*" test_rule.txt //匹配所有内容
(3)“^”匹配行首,“$”匹配行尾
①# grep "^M" test_rule.txt //匹配以大写“M”开头的行
②# grep "n$" test_rule.txt //匹配以小写n结尾的行
③# grep -n "^$" test_rule.txt //匹配空白行,-n表示输出的同时打印行号。
(4)“[]”匹配中括号中指定的任意一个字符,只匹配一个字符。
①# grep "s[ao]id" test_rule.txt //匹配s和i字母中,要不是a,要不是o
②# grep "[0-9]" test_rule.txt //匹配任意一个数字
③# grep "^[a-z]" test_rule.txt //匹配用小写字母开头的行。
④# grep "^[^0-9]" test_rule.txt //匹配以非数字开头的行
(5)“\”转义符
①# grep "\.$" test_rule.txt //匹配以“.”结尾的行
(6)“\{n\}”表示其前面的字符恰好出现n次。
①# grep "a\{3\}" test_rule.txt //匹配a字母连续出现3次的字符串,因正则是包括匹配,只要字符串中有3个连续的a则匹配。
②# grep "[0-9]\{3\}" test_rule.txt //匹配包含连接3个数字的字符串
(7)“\{n,\}”表示其前面的字符出现不小于n次
# grep "^[0-9]\{3,\}[a-z]" test_rule.txt //匹配最少用连续3个数字开头的行。
(8)“\{n,m\}”匹配其前面的字符至少出现n次,最多出次m次。
# grep "sa\{1,3\}i" test_rule.txt //匹配在字母s和i之间最少一个a最多3个a