码迷,mamicode.com
首页 > 其他好文 > 详细

sed配合正则表达式应用

时间:2016-03-31 00:28:15      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:linux sed 正则表达式

题目:要求用sed将/et/passwd的每一行的第一个数和最后一个单词交换位置

[root@oldboy etc]# sed -n ‘1p‘ passwd

root:x:0:0:root:/root:/bin/bash

一、分析:sed替换配合正则表达式将会发挥最佳效果。下面来分析匹配特点:

因为passwd文件每一行的特点都是一样的,所以先提取第一列观察,题目要求将第一个数字和最后一个单词替换,所以整行至少会被分隔成4段,用sed替换()后向引用\1与\4交换位置即可。

特点分析

第1段root:x:         非数字

第2段0             纯数字

第3段:0:root:/root:/bin/ 不以字母或数字开头和不以字母或数字结尾

第4段bash           以字母结尾

二、写出匹配的表达式:

1.([^0-9]+)

2.([0-9]+)

3.([^0-9].*[^0-9])或者([^a-z].*[^a-z])

4.([a-z]+$)

三、验证: 

情况1:[root@oldboy etc]# sed -nr ‘1s#([^0-9]+)([0-9]+)([^0-9].*[^0-9])([a-z]+$)#\3#gp‘ passwd 

:0:root:/root:/bin/bas

情况2:[root@oldboy etc]# sed -nr ‘1s#([^0-9]+)([0-9]+)([^a-z].*[^a-z])([a-z]+$)#\3#gp‘ passwd 

:0:root:/root:/bin/

  经过验证发现,当以非数字开头和非数字结尾”这个条件作为匹配时,是行不通的,因为在想要匹配的字段(:0:root:/root:/bin/)后面是字母bash,匹配完前面的部分,后面的字符依然符号匹配要求,所以此处只能以“不以字母开头&&者不以字母结尾”为匹配条件。

根据1.2.3.4匹配条件可以得出结论:要将一种类型字符作为匹配条件,尽量选择非此类型作为匹配条件,这样才能将匹配条件缩到最小。


sed配合正则表达式应用

标签:linux sed 正则表达式

原文地址:http://mtccvip.blog.51cto.com/7289462/1758577

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!