正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。
Shell 正则表达式分为两种:
- 基础正则表达式:BRE(basic regular express)
- 扩展正则表达式:ERE(extend regular express),扩展的表达式有+、?、|和()
| 符号 | 描述 | 通俗解释 | 示例 | | —- | —- | —- | —- | | . | 匹配除换行符(\n)之外的任意单个字符 | 任意字符 | echo -e “123\n456” | grep ‘1.3’ | | ^ | 匹配前面字符串开头 | 开头 | echo -e “abc123123abc” | grep ‘^abc’ | | $ | 匹配前面字符串结尾 | 结尾 | echo -e “abc123123qwe” | grep ‘qwe$’ | | | 匹配前1个字符0个或多个 | 前面字符的0次或多次 | echo -e “abc\nabcc\naabc\aabbcc\nab” | grep ‘abc‘ | | + | 匹配前1个字符1个或多个 | 前面字符的1次或多次 | echo -e “abc\nabcc\naabc\aabbcc\nab” | grep -E ‘abc+’ | | ? | 匹配前面字符0个或1个 | 前面字符的0次或1次 | echo -e “abc\naabbcc\nab\nbc\nabcc” | grep -E ‘abc?’ | | ^$ | 匹配空行,空行这一行没有任何字符 | 啥都没,空行 | echo -e “\n\n\n123123” | grep -E “^$” | | . | 匹配任何字符 | 啥都匹配,包括空行 | echo -e “ab3\nab1\nabf\nab7” | grep -E ‘^.b’ | | [] | 匹配括号中任意1个字符 | 括号里的字符匹配1次 | echo -e “ab3\nab1\nabf\nab7” | grep -E ‘ab[137]’ | | [ .-.] | 匹配括号范围内的任意1个字符 | 括号范围里的字符 | echo -e “ab3\nab1\nabf\nab7” | grep -E ‘ab[0-9]’ | | [^] | 匹配[^]之外的任意1个字符 | 括号范围外的字符 | echo -e “ab3\nab1\nabf\nab7” | grep -E ‘ab[^a-z]’ | | ^[^] | 匹配不是^[^]中的任意1个字符开头的行 | 括号范围外开头的字符 | echo -e “1ab3\nab1\nabf\nab7” | grep ‘^[^a-z]’ | | {n}或{n,} | 匹配花括号前面字符至少n个字符 | 指定n次或n次以上 | echo -e “ab3\nab1\nabf\nab7” | grep -E ‘[a-z]{3}’ | | {n,m} | 匹配花括号前面字符至少n个字符最多m个字符 | 指定n次到n+次 | echo -e “1\n12\n123\n1234” |grep -E -w ‘[0-9]{2,3}’ | | \< | 边界符,匹配字符串开始 |
| echo -e “1\n12\n123\n1234” |grep ‘\<123' | | \\> | 边界符,匹配字符串结束 |
| echo -e "1\\n12\\n123\\n1234" |grep '4\\>‘ | | () | 单元或组合:将小括号里面 作为一个组合 | 将括起来的内容当做整体 | echo -e “1\n12\n123\n1234” |grep -E ‘(12)’ | | | | 匹配竖杠两边的任意一个 | 要么左边要么右边 | echo -e “1\n12\n123\n1234” |grep -E ‘12\>|123\>’ | | \ | 转义符,将特殊符号转成原 有意义 |
| 1.2,匹配 1.2:1\.2,否则 112 也会匹配到 |
| 支持特殊的字符 | 描述 |
|---|---|
| \w | 匹配任意数字和字母,等效[a-zA-Z0-9] |
| \W | 与\w相反,等效[^a-zA-Z0-9] |
| \b | 匹配字符串开始或结束,等效\<和\> |
| \s | 匹配任意的空白字符 |
| \S | 匹配非空白字符 |
| \d | 0-9的任意一个数字 |
正则的特色:
- 正则表达式的贪婪性,
.*表示所有或*连续出现的时候,尽可能的贪婪匹配 *代表了0次或多次,所以我们在查询单个字符时用a*这种形式,是会匹配全部的(匹配到了空行)- [a-z|A-Z|0-9] [a-z A-Z 0-9] 两个表达式除了匹配字符还会匹配
|和空格。中括号中的特殊字符没有任何含义
1.匹配正整数
vim 123.txt12312323-1231.23-3.34-14312.340.112cat 123.txt | grep -e '^[1-9]*[0-9][0-9]*$'以1-9开头,数字出现多次,中间数字为0-9,结尾以数字结尾
2.负整数
cat 123.txt | grep -e '^-[0-9][0-9]*$'
3.整数
cat 123.txt | grep -e '^[1-9-][0-9][0-9]*$'
4.截取到某个字符
cat 123.txt | grep -e '^.$a' #以任何字符开头重复出现任意次数,末尾为a。
5.基础查询身份证
grep -E '[0-9]{17}[0-9X]' ss.txt
