题目:要求用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匹配条件可以得出结论:要将一种类型字符作为匹配条件,尽量选择非此类型作为匹配条件,这样才能将匹配条件缩到最小。