正则表达式介绍与基础

正则表达式介绍与基础

首先是正则表达式的特殊符号:

[:alnum:]代表英文大小写字母及数字

[:alpha:]代表英文大小写字母

[:blank:]代表空格和 tab 键

[:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL

[:digit:]代表数字

[:graph:]代表空白字符以外的其他

[:lower:]小写字母

[:print:]可以被打印出来的任何字符

[:punct:]代表标点符号

[:upper:]代表大写字母

[:space:]任何会产生空白的字符如空格,tab,CR 等

[:xdigit:]代表 16 进位的数字类型

使用特殊符号查找小写字母:

grep -n '[[:lower:]]' regular_express.txt

img

使用特殊符号查找数字:

grep -n '[[:digit:]]' regular_express.txt

img

grep命令

参数说明:

  • -a :以 text 档案的方式搜寻 binary 档案数据

  • -c :计算找到 '搜寻字符串' 的次数

  • -i :忽略大小写的不同,所以大小写视为相同

  • -n :顺便输出行号

  • -v :反向选择,亦即显示没有 '搜寻字符串' 内容的行

grep -n 'the' regular_express.txt 
grep -in 'the' regular_express.txt

img

反向查找,当该行没有字符串'the'时才显示在屏幕上。

grep -vn 'the' regular_express.txt

2-1-1

字符组匹配

[ ] 可以用来查找字符组。

值得注意的是,无论 [ ] 中包含多少个字符,它都只代表一个字符。比如说,我们想要查找 tast 或者 test 这两个字符串,注意到二者的拼写大部分相同,都是 t?st 的形式,故此时可以使用 [ ] 进行查找:

grep -n 't[ae]st' regular_express.txt

2-2-0

字符组支持使用连字符 - 来表示一个范围。当 - 前后构成范围时,要求前面字符的码位小于后面字符的码位。

[^] 为反向选择字符组,用于排除后面的字符,使用方式为 [^...]

需要注意 [^] 与参数 -v 的区别,尽管二者都表示反向选择,但是如果包含有反向选择的字符的行含有其他字符的话,[^] 仍会输出该行,而 -v 则只会输出不含有反向选择的字符的行。

下面给出一些应用示例:

[abc]                   :表示 “a” 或 “b” 或 “c” 
​
[0-9]                   :表示 0~9 中任意一个数字,等价于 [0123456789] 
​
[\u4e00-\u9fa5]         :表示任意一个汉字 
​
[^a1<]                  :表示除 “a”、“1”、“<” 外的其它任意一个字符
​
[^a-z]                  :表示除小写字母外的任意一个字符
 

使用 -[^] 查找 Xoo 形式的字符串,要求 oo 之前不能包含小写字母:

grep -n '[^a-z]oo' regular_express.txt

回忆前一节所提到的正则表达式特殊符号,[:lower:] 表示小写字母,因此也可以使用

grep -n '[^[:lower:]]oo' regular_express.txt

img

这两者是等价的,但是可以看出,使用[a-z]来表示小写字母明显更加便捷,也更加灵活。

查找字符 oog

grep -n 'oog' regular_express.txt

如果我不想要 oog 字符前面有 g,则使用 [^g]oog

grep -n '[^g]oog' regular_express.txt

同理,若不想让字符 oog 前面为 g 或者 o,则使用 [^go]oog

grep -n '[^go]oog' regular_express.txt

2-2-2

其中

grep -n '[^go]oog' regular_express.txt

返回结果为空,表示没有匹配到符合要求的字符串。

行首符 ^ 与行尾符 $

在第一个实验中,我们使用

grep -n 'the' regular_express.txt

查找含有 the 的字符串,如果你只想查找行首为 the 的字符行,则使用以下命令:

grep -n '^the' regular_express.txt

查找行首为大写字母的所有行:

grep -n '^[A-Z]' regular_express.txt

注意行首符 ^ 和反向选择 [^] 的区别,^[A-Z] 表示以大写字母开头。[^A-Z] 表示除了大写字母 A-Z 的所有字符。

行尾符 $ 的用法与行首符类似。

查找以字母 d 结尾的行:

grep -n 'd$' regular_express.txt

这里有一个小技巧,将行首符与行尾符连用,可以用来查找空行:

grep -n '^$' regular_express.txt
应用实例

查看 /etc/insserv.conf 文档

^$: 过滤掉空白行

^#: 过滤掉注释行(以 # 号开头)

cat -n /etc/insserv.conf
​
grep -v '^$' /etc/insserv.conf | grep -v '^#'

2-2-3

                    任意一个字符 . 与重复字符

查找 a?ou? 类型的字符:

grep -n 'a.ou.' regular_express.txt

其中小数点表示任意一个字符,一个小数点只能表示一个未知字符。

*(星号):代表重复前面 0 个或者多个字符。
e*: 表示具有空字符或者一个以上 e 字符。
ee*,表示前面的第一个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。
eee*,表示前面两个 e 字符必须存在。第三个 e 则可以是 0 个或者多个 e 字符。
ee*e :表示前面的第一个与第三个 e 字符必须存在。第二个 e 则可以是 0 个或者多个 e 字符。

下面的第一条命令与第二条命令由于允许存在空字符,所以会打印所有文本。

grep -n 'e*' regular_express.txt
​
grep -n '@*' regular_express.txt
​
grep -n 'eee*' regular_express.txt

限定连续字符范围 { }

{ } 可限制一个范围区间内的重复字符数。如果现在要求找出存在连续的两个 o 字符的字符串,根据前面所学的知识,我们可以使用:

grep -n 'ooo*' regular_express.txt

另一种方式是使用 { }。由于 {} 在 shell 中有特殊意义,故在使用时需要用到转义字符 \

查找连续的两个 o 字符:

grep -n 'o\{2\}' regular_express.txt

查找 g 后面接 2 到 5 个 o,然后再接 g 的字符串:

grep -n 'go\{2,5\}g' regular_express.txt

总结:

^word    表示待搜寻的字符串(word)在行首
word$    表示待搜寻的字符串(word)在行尾
.(小数点) 表示 1 个任意字符
\        表示转义字符,在特殊字符前加 \ 会将特殊字符意义去除
*        表示重复 0 到无穷多个前一个 RE(正则表达式)字符
[list]   表示搜索含有 l,i,s,t 任意字符的字符串
[n1-n2]  表示搜索指定的字符串范围,例如 [0-9] [a-z] [A-Z] 等
[^list]  表示反向字符串的范围,例如 [^0-9] 表示非数字字符,[^A-Z] 表示非大写字符范围
\{n,m\}  表示找出 n 到 m 个前一个 RE 字符
\{n,\}   表示 n 个以上的前一个 RE 字符

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是萌新程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值