正则表达式

什么是正则表达式:简单地说,正则表达式就是处理字符串的方法,它以行为单位来进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可以让用户轻易的完成查找、删除、替换某特定字符串的处理过程。

正则表达式的字符串表示方法依照不同的严谨度分为:基础正则表达式、扩展正则表达式。

注:正则表达式与通配符是完全不一样的东西,通配符代表的是bash操作接口的一个功能,但正则表达式是一种字符串处理的表示方式。

基础正则表达式

既然正则表达式是一种字符串处理的表示方式,那么对字符排序有影响的语系就会对正则表达式的结果有影响,举例来说,在英文大小写的编码顺序中,zh_CN及C这两种语系的输出结果如下:

  • LANG=zh_CN时: 0 1 2 3 4 ... a A b B c C ... z Z
  • LANG=C时:0 1 2 3 4 ... A B C D ... Z a b c d ... 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:]标点符号
[:upper:]大写字符,A~Z
[:space:]任何会产生空白的字符
[:xdigit:]十六进制的数字类型

以下面这个文件内容为例来练习:

"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.^M
GNU is free air not free beer.^M
Her hair is very beauty.^M
I can't finish the test.^M
Oh! The soup taste good.^M
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!     My god!
The gd software is a library for drafting programs.^M
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird

保存为regular_express.txt文件

  • 查找文件中the这个特定字符
[root@linux ~]# grep -n 'the' regular_express.txt

  • 反向选择,显示没有the这个字符的行
[root@linux ~]# grep -vn 'the' regular_express.txt

  • 取得不论the大小的行
[root@linux ~]# grep -in 'the' regular_express.txt

  • 查找test或taste这两个关键字所在行
[root@linux ~]# grep -n 't[ea]' regular_express.txt

  

  • 查找oo前面没有g所在行
[root@linux ~]# grep -n '[^g]oo' regular_express.txt

  • oo前面不能有小写字符
[root@linux ~]# grep -n '[^a-z]oo' regular_express.txt
或
[root@linux ~]# grep -n '[^[:lower:]]oo' regular_express.txt

 

  •  只要the在行首的
[root@linux ~]# grep -n '^the' regular_express.txt

  • 只要行尾结束为小数点.的
[root@linux ~]# grep -n '\.$' regular_express.txt

注:. 小数点具有其他意义,必须使用转义符号来解除其特殊意义

  • 找出空白行
[root@linux ~]# grep -n '^$' regular_express.txt

 

  • 找出g??d的字符串
[root@linux ~]# grep -n 'g..d' regular_express.txt

  • 找出至少两个o以上的字符串
[root@linux ~]# grep -n 'g..d' regular_express.txt

  • 找出任意数字的行列
[root@linux ~]# grep -n '[0-9][0-9]*' regular_express.txt

 

  • 找出两个o的字符串
[root@linux ~]# grep -n 'o\{2\}' regular_express.txt

  • 找出g后面接2到5个o,再接一个g的字符串
[root@linux ~]# grep -n 'go\{2,5\}g' regular_express.txt

基础正则表达式字符集合:

RE字符意义
^word待查找的字符串在行首
word$待查找的字符串在行尾
.代表一定有一个任意字符的字符
\转义符,将特殊符号的特殊意义去掉
*重复0个到无穷多个的前一个RE字符
[list]字符集合的RE字符,里面列出想要选取的字符
[n1-n2]字符集合的RE字符,里面列出想要选取的字符范围
[^list]字符集合的RE字符,里面列出不要的字符串或范围
\{n,m\}

连续n到m个的前一个RE字符

若为\{n\}则是连续n个前一个RE字符

若为\{n,\}连续n个以上的前一个RE字符

注:通配符中的*代表的是0~无限多个字符,在正则表达式中,*表示重复0到无穷多个的前一个RE字符 

扩展正则表达式

RE字符意义
+重复一个或一个以上的前一个RE字符
0个或一个的前一个RE字符
|用或的方式找出数个字符串
()找出群组字符串
()+多个重复群组的判别

grep默认仅支持基础正则表达式,如果要使用扩展正则表达式,可以使用grep -E或者直接使用egrep。

1、查找god、good、goood等的字符串

[root@linux ~]# egrep -n 'go+d' regular_express.txt

2、查找gd,god这两个字符串

[root@linux ~]# egrep -n 'go?d' regular_express.txt

3、查找gd或god这两个字符串

[root@linux ~]# egrep -n 'gd|god' regular_express.txt

 4、查找glad或good这两个字符串

[root@linux ~]# egrep -n 'g(la|oo)d' regular_express.txt

5、将【AxyzxyzxyzxyzxyzC】用echo打印,找开头是A结尾是CC,中间有一个以上的"xyz"字符串

[root@linux ~]# echo AxyzxyzxyzxyzxyzC | egrep 'A(xyz)+C'

sed的使用

sed是一个管道命令,可以分析标准输入,还可以将数据进行替换、删除、新增、选取特定行等功能。

语法:

sed [-nefri] [操作]

-n:使用安静模式,在一般sed的用法中,所有来自stdin的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行(或操作)才会被列出来

-e:直接在命令行模式上进行sed的操作编辑

-f:直接将sed的操作写在一个人间内, -f filename 则可以执行filename内的sed操作

-r:sed的操作使用的是扩展型正则表达式的语法

-i:直接修改读取的文件内容,而不是由屏幕输出

操作说明:[n1,[n2]] function

n1,n2:不见得会存在,一般代表【选择进行操作的行数】,举例来说,如果操作是需要在10到20行之间进行的,则【10,20[操作行为]】

function有下面这些东西:

a:新增,a的后面可以接字符,而这些字符会在新的一行出现(目前的下一行)

c:替换,c的后面可以接字符,这些字符可以替换n1,n2之间的行

d:删除,因为是删除,d后面通常不接任何东西

i:插入,i的后面可以接字符,而这些字符会在新的一行出现(目前的上一行)

p:打印,将某个选择的数据打印出来,通常p会与参数sed -n一起运用

s:替换,可以直接进行替换的工作,通常这个s的操作可以搭配正则表达式

以行为单位的新增/删除功能 

1、将/etc/passwd的内容列出并打印行号,同时,请将第2~5行删除

[root@linux ~]# cat -n /etc/passwd | sed '2,5d'

注:sed后面的操作要以' '两个单引号括住 

2、在第2行后加上drink tea?字样

[root@linux ~]# nl /etc/passwd | sed '2a drink tea'

3、在第2行后面加上两行字

[root@linux ~]# nl /etc/passwd | sed '2a drink tea or ......\
drink beer'

注:新增多行时,,每行之间必须要以反斜杠\来进行新行的增加 

以行为单位的替换与显示功能

4、将2~5行的内容替换成no 2~5 number

[root@linux ~]# nl /etc/passwd | sed '2,5c no 2~5 number'

5、仅列出文件内的2~5行 

[root@linux ~]# nl /etc/passwd | sed -n '2,5p'
  • -n代表安静模式,如果没有加上-n的话,2~5行会重复输出
  •  

部分数据的查找并替换功能

sed 's/要被替换的字符/新的字符/g' 

6、查询这台虚拟机的IP地址

首先,可以利用ifconfig这个命令来查看IP地址所在的那一行

[root@linux ~]# ifconfig ens33

然后可以发现IP地址在第二行,把它单独弄出来

[root@linux ~]# ifconfig ens33 | grep 'inet '

这时候就可以使用sed的替换功能了

[root@linux ~]# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g'

[root@linux ~]# ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'

直接修改文件内容

7、利用sed将regular_express.txt内每一行结尾若为.则换成!

[root@linux ~]# sed -i 's/\.$/\!/g' regular_express.txt

8、利用sed直接在 regular_express.txt最后一行加入 # this is a test.

[root@linux ~]# sed -i '$a # this is a test.' regular_express.txt
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wu小燕呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值