Linux正则表达式的初探

什么是正则表达式

正则表达式并不是一个工具程序,而是一种字符串处理的标准依据,如果要想用正则表达式来处理字符串,就要用支持正则表达式的工具。正则表达式是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以很容易得达到查找、删除、某特定字符串的处理。通常情况下正则表达式分为基础正则表达式和扩展正则表达式。

正则表达式和bash的通配符(wildcard)是两个完全不同的概念,通配符是代表bash环境接口的一个功能。关于通配符的简单介绍,可以参考另一篇博文”bash环境中的通配符和特殊符号的简单介绍“

语系对正则表达式的影响

不同的语系,字符的编码顺序可能不同,当对字符操作的时候,就会有不同的结果。

例如。LANG=C时;0 1 2 3 ... A B C D ... Z a b c d ...z

LANG=zh_CN时;0 1 2 3  ... a A b B c C d D ... z Z 如果你要用[a-z]来选择全部的小写字符的时候,就会得到不同的结构。 为了避免上面的这种编码顺序所造成的问题,当我们使用正则表达式的时候,有一些特殊的符号我们可以使用。

特殊字符
代表意义
[:alnum:]
使用英文大小写字符及数字,即 0-9,A-Z,a-z
[:alpha:]
代表任何英文大小写字符,即 A-Z,a-z
[:blank:]
代表空格键与[Tab]按键
[:cntrl:]
代表键盘上的控制按键,即包括CR,LF,Tab,Del...等等
[:digit:]
代表数字,即 0-9
[:graph:]
除了空格符(空格键与[Tab]按键)外的其他所有按键
[:lower:]
代表小写字符,即 a-z
[:print:]
代表任何可以打印出来的字符
[:punct:]
代表标点符号(punctuation symbol),即: : ' ? ! ; : # $
[:upper:]
代表大写字符,即 A-Z
[:space:]
任何会产生空白的字符,包括空格键,[Tab],CR等等
[:xdigit:]
代表16进制的数字类型,包括:0-9,A-F,a-f的数字与字符

基础正则表达式(BRE)字符介绍

RE字符
说明
例子
^string
待搜索的字符串(string)在行首
搜索行首为#的行 $grep '^#' test.txt
string$
待搜索的字符串(string)在行尾
搜索行尾为!的行 $grep '!$' test.txt
.
代表一定有一个任意字符
搜索[e一个任意字符e] $grep 'e.e' test.txt
\
转义字符,将特殊符号转义成一般字符
搜索含有单引号'的行 $grep \' test.txt
*
重复0个到无穷多个前一个RE字符
搜索含有er err errr等等的字符串 $grep 'err*' test.txt
[list]
中括号中只代表一个待搜索的字符
搜索含有agt,agr,agx的行 $grep 'ag[trx] test.txt
[n1-n2]
中括号中列出想要搜索的字符范围
搜索含有数字的行 $grep '[0-9]' text.txt
[^list]
中括号中列出不要的字符串或者范围
搜索的行中含有xx*,但是不能含有xxy $grep 'xx[^y]' test.txt
\{n,m\}
连续n到m个前一个RE字符
搜索含有good或者goood字符串的行 $grep 'go\{2,3\}d' test.txt

一些基础正则表达式例子:

[root@rhel6164 ~]# grep '[^a-z]oo' test.txt
#打印oo前面不含小写字母的行
[root@rhel6164 ~]# grep '[^[:lower:]]oo' test.txt
#因为上面表示的小写字母有可能会因为语系不同编码造成影响,可以用第二个命令
[root@rhel6164 ~]# grep '^$' test.txt 
# 打印出空白行
[root@rhel6164 ~]# grep '.*oo' test.txt
# .*表示任意字符,打印oo前面含有任意字符的行
特别注意*,表示重复前一个0到无穷多次的意思,为组合形态。例如e*就代表空字符或者一个e以上的字符。特别要注意是允许空字符。$grep 'e*' text.txt将会把所有的行都会打印出来。

扩展正则表达式(ERE)字符介绍

RE字符
说明
例子
+
重复一个或一个以上的前一个RE字符
搜索g含有od,good,goood...的字符串的行 $egrep 'go+d' test.txt
?
0个或一个的前一个RE字符
搜索含有gd,god两个字符串的行 $egrep 'go?d' test.txt
|
用或(or)的方式找出来的字符串
搜索含有gd或good两个字符串的行 $egrep 'gd|god' test.txt
( )
找出群组字符串
搜索含有glad或good字符串的行 $egrep 'g(la|oo)d test.txt
( )+
多个群组的判别
搜索含有AxyzxyzxyzC字符串的行 $egrep 'A(xyz)+C' test.txt

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值