sed配合正则表达式应用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed配合正则表达式应用相关的知识,希望对你有一定的参考价值。

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

[[email protected] 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:[[email protected] etc]# sed -nr ‘1s#([^0-9]+)([0-9]+)([^0-9].*[^0-9])([a-z]+$)#\3#gp‘ passwd 

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

情况2:[[email protected] 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配合正则表达式应用的主要内容,如果未能解决你的问题,请参考以下文章

sed的分组用法

shell脚本——正则表达式Sed与Awk文本处理工具详解

十七. 正则以及grep ,sed,awk的简单应用

正则表达式

grep,sed,awk与简单正则表达式应用

使用正则表达式和 sed 时跳过前 n 行?