LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: jiazhengw

多发发一些有意思的题做做呀![+sed/awk/regex练习]

[复制链接]
发表于 2006-3-13 13:42:03 | 显示全部楼层
Post by yongjian
两位数那个你写反了。先做做吧。有些题还要多想想。


I'm trying to verify the regular expression from jiazhengw.
It really takes me time.
回复 支持 反对

使用道具 举报

发表于 2006-3-13 22:10:12 | 显示全部楼层
小弟刚研习了sed,所以在此将第一题在用sed做了一下,感觉不怎么好,有点冗长了,而且用了两个命令,希望高手给予点评
第一个文件名为command,第二个文件名为cmdintro


  1. # filename: clean
  2. :loop
  3. N
  4. /^\n$/ {
  5.         $ { d }
  6.         D
  7. }
  8. /\n$/ {
  9.         s/\n$//
  10.         b
  11. }
  12. s/\(.\+\)\n\(.\+\)/\1 \2 /
  13. s/[\t ]\+/ /g
  14. $!b loop
复制代码


  1. bash# sed -f clean cmdintro | egrep '.' > after
  2. bash# sed -e '/^$/ { $d;N;/^\n$/D }; /^\n/!s/^/\n/; s/\(.*\)/\1:/;  R after' command | egrep -A1 '.'
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-3-14 11:13:18 | 显示全部楼层
Post by yongjian


IP类型
1. 一个真实的IP地址的表达式. 以xxx.xxx.xxx.xxx表达。
2. 一个A类地址的表达式。
3. 一个B类地址的表达式。
4. 一个C类地址的表达式。
5. 9.80.1.15 - 9.83.253.100 的所有IP表达式(netmask = 255.252.0.0)




  1. 1.^(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))$

  2. 2.^([1-9][0-9]?|1[0-2][0-7])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))$

  3. 3.^1([3-8][0-9]|2[89]|9[01])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))$

  4. 4.^(19[2-9]|2[0-1][0-9]|22[0-3])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.){2}([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))$

复制代码


{}的表达有可能存在差异

关于第5个小题,网络地址应该为9.80.0.0,按照要求是不是需要匹配如下的几段:
1. 9.80.1.15 ~ 9.80.255.255
2. 9.81.0.0   ~ 9.81.255.255
3. 9.82.0.0   ~ 9.82.255.255
4. 9.83.0.0   ~ 9.83.253.100

盼复~

先贴上来,呵呵,小弟先将这四段分开表示,最后合并,感觉好长,心里没底啊
不过偶已经测试过



  1. 1. ^9\.80\.(([2-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))|1\.(1[5-9]|[2-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5])))$

  2. this matches item 2 and 3
  3. 2. ^9\.8[12](\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))){2}$

  4. 3. ^9\.83\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-2]))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))|253\.([0-9]|[1-9][0-9]|100))$

复制代码


来最后合并了


  1. ^9\.8((0\.(([2-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))|1\.(1[5-9]|[2-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))))|([12](\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))){2})|(3\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-2]))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2([0-4][0-9]|5[0-5]))|253\.([0-9]|[1-9][0-9]|100))))$

复制代码


说句实话,我自己都晕了,但是我可是认真的测试过的,希望有空并且有兴趣的朋友们在帮我verify一下.更希望有高手来指点一下,个人感觉太冗长了,有点受不了
回复 支持 反对

使用道具 举报

发表于 2006-3-14 11:26:14 | 显示全部楼层
是的。通过netmask就可以算出了。
回复 支持 反对

使用道具 举报

发表于 2006-3-14 12:46:47 | 显示全部楼层
Post by yongjian
是的。通过netmask就可以算出了。


已经写在73楼了,累!
回复 支持 反对

使用道具 举报

发表于 2006-3-14 13:54:30 | 显示全部楼层
  1. 2[0-5]{2}
复制代码
这个表达式显然是错的。
回复 支持 反对

使用道具 举报

发表于 2006-3-14 13:59:34 | 显示全部楼层
Post by yongjian
  1. 2[0-5]{2}
复制代码
这个表达式显然是错的。


:ask

yongjian兄,我用egrep来引用的,应该没错吧
不知道yongjian兄是指syntax还是匹配上有错误
2[0-5]{2}匹配200~255

等待审批中...
回复 支持 反对

使用道具 举报

发表于 2006-3-14 14:13:22 | 显示全部楼层
Post by johnny_jiang
:ask

yongjian兄,我用egrep来引用的,应该没错吧
不知道yongjian兄是指syntax还是匹配上有错误
2[0-5]{2}匹配200~255

等待审批中...

[0-5]只匹配0-5,而{2}表示重复上面的匹配2次,这样实际匹配的只有[0-5][0-5],但是从0-4时,个位是可以[0-9]的。
回复 支持 反对

使用道具 举报

发表于 2006-3-14 15:17:13 | 显示全部楼层
Post by yongjian
[0-5]只匹配0-5,而{2}表示重复上面的匹配2次,这样实际匹配的只有[0-5][0-5],但是从0-4时,个位是可以[0-9]的。


感谢yongjian兄的指点,其实我已经晕了...

73楼已经改好,希望是正确的把
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-15 14:10:51 | 显示全部楼层
Post by yongjian
两位数那个你写反了。先做做吧。有些题还要多想想。


是的,我是从个位判断的,个位如果是0,则十位可以是[1-9],依此类推。如果从十位判断也可以,十位如果是9,则个位可以是[0-8],这样也可以。我觉得用这样的方法那如果是三位数那岂不是长得将人看晕了,呵呵!总觉得有简单的方法,但想不出。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表