Shell正则表达式
文章目录
正则表达式在每种语言中都会有,功能就是匹配复合预期要求的字符串。
shell正则表达式分为两种:
- 基础正则表达式:BRE
- 扩展正则表达式:ERE,扩展的表达式有+、?、|和()
下面是一些常用的正则表达式符号,拿 grep 工具举例说明。
符号:
.
描述:匹配除换行符(\n)之外的任意单个字符
示例:
[root@tang tang]# ls
1 1l 1x 2i 2u 3f 3r 4c 4o 5 5l 5x 6i 6u 7f 7r 8c 8o 9 9l 9x j v
1a 1m 1y 2j 2v 3g 3s 4d 4p 5a 5m 5y 6j 6v 7g 7s 8d 8p 9a 9m 9y k w
1b 1n 1z 2k 2w 3h 3t 4e 4q 5b 5n 5z 6k 6w
-----------------------省略--------
[root@tang tang]# ls|grep '1.'
#.代表任意字符
1a
1b
1c
1d
---------
1z
^
描述:匹配前面字符串开头
示例:
[root@tang tang]# echo -e "123\n456\n789"|grep ^1
123
$
描述:匹配前面字符串结尾
示例:
[root@tang tang]# echo -e "123\n456\n789"|grep 9$
789
[root@tang tang]# echo -e "123\n456\n789"|grep 4$
#并没有4结尾的
[root@tang tang]# echo -e "123\n456\n789"|grep 3$
123
*
描述:匹配前一个字符零个或多个
示例:
[root@tang tang]# echo -e "x\nxo\nxoo\no\noo" |grep "xo*"
x
xo
xoo
x 是必须的,批量了 0 零个或多个
+
描述:匹配前面字符一个或多个
示例:
[root@tang tang]# echo -e "abc\nabcc\nadd\nabccc\nabdd" |grep -E 'ab+'
abc
abcc
abccc
abdd
连续匹配多个数字:
[root@tang tang]# echo "113" |grep -E '[0-9]+'
113
匹配单个数字:
[root@tang tang]# echo "113" |grep -o '[0-9]'
1
1
3
?
描述:匹配前面字符0个或1个
示例:
[root@tang tang]# echo -e "a\nab\nabc\nabcd"|grep -E 'b?c'
abc
abcd
[ ]
描述:匹配中括号之中的任意一个字符
示例:
[root@tang tang]# echo -e "a\nab\nabc\nabcd"|grep -E '[bd]'
ab
abc
abcd
#匹配b或者d
[ .-.]
描述:匹配中括号中范威内的任意一个字符
示例:
[root@tang tang]# echo -e "a\nab\nabc\nabcd"|grep -E '[a-z]'
a
ab
abc
abcd
匹配所有字母:
[^]
描述:匹配[^字符]之外的任意一 个字符
示例:
[root@tang tang]# echo -e "a\nab\nabc\nabcd"|grep -E '[^a]'
ab
abc
abcd
[]
描述:匹配不是中括号内任意一个 字符开头的行
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E '^[^b]'
a
{n}或 {n,}
描述:匹配花括号前面字符至少 n 个字符
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E '[a-z]{4}'
babc
babcd
{n,m}
描述:匹配花括号前面字符至少 n 个字符,最多 m 个字符
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E '[a-z]{3,4}'
bab
babc
babcd>这个满足匹配的条件,babc被匹配,但是d没有
\<
描述:边界符,匹配字符串开始
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E '\<a'
a
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E '\<b'
bab
babc
babcd
\>
描述:边界符,匹配字符串结束
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E 'b\>'
bab
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E 'c\>'
babc
( )
描述:单元或组合:将小括号里面作为一个组合
分组:匹配小括号中正则表达式或字符.\n反向引用,n是数字,从1开始编号,表示引用第n个分组匹配的内容
示例:
[root@tang tang]# echo -e "123abc"|grep -E '([0-9a-z])'{4}
123abc
匹配到123a
|
描述:匹配|两边的任意一个
示例:
[root@tang tang]# echo -e "a\nbab\nbabc\nbabcd"|grep -E 'b\>|a\>'
a
bab
\
描述:转义符,将特殊符号转成原有意义
示例:
1.2,匹配 1.2:1\.2,否则 112 也会匹配到
工具
在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具:
命令 | 描述 |
---|---|
grep | 默认不支持扩展表达式,加-E 选项开启 ERE。如果不加-E 使用花括号要加 转义符{} |
egrep | 支持基础和扩展表达式 |
awk | 支持 egrep 所有的正则表达式 |
sed | 默认不支持扩展表达式,加-r 选项开启 ERE。如果不加-r 使用花括号要加 转义符{} |
支持的特殊字符 | 描述 |
---|---|
\w | 匹配任意数字和字母,等效[a-zA-Z0-9_] |
\W | 与\w 相反,等效[^a-zA-Z0-9_] |
\b | 匹配字符串开始或结束,等效<和> |
\s | 匹配任意的空白字符 |
\S | 匹配非空白字符 |
空白符 | 描述 |
---|---|
\n | 换行符 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\0 | 空值符 |
\b | 退后一格 |