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
来源: