免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2412 | 回复: 9
打印 上一主题 下一主题

求删除特定字符片区的方法 [复制链接]

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-21 18:48 |只看该作者 |倒序浏览
内容如下:

  1. lease 10.108.215.134 {
  2.   starts 2 2014/05/20 13:46:14;
  3.   ends 3 2014/05/21 13:46:14;
  4.   cltt 2 2014/05/20 13:46:14;
  5.   binding state active;
  6.   next binding state free;
  7.   rewind binding state free;
  8.   hardware ethernet 6c:e8:73:ad:32:db;
  9.   uid "\001l\350s\2552\333";
  10.   option agent.remote-id 0:23:ed:22:69:a2;
  11.   client-hostname "WR740N";
  12. }
  13. lease 10.108.215.140 {
  14.   starts 2 2014/05/20 13:46:21;
  15.   ends 3 2014/05/21 13:46:21;
  16.   cltt 2 2014/05/20 13:46:21;
  17.   binding state active;
  18.   next binding state free;
  19.   rewind binding state free;
  20.   hardware ethernet 20:dc:e6:3c:7f:4b;
  21.   uid "\001 \334\346<\177K";
  22.   option agent.remote-id a4:7a:a4:73:6e:1e;
  23.   client-hostname "WR740N";
  24. }
  25. lease 10.108.215.148 {
  26.   starts 2 2014/05/20 15:12:33;
  27.   ends 3 2014/05/21 15:12:33;
  28.   cltt 2 2014/05/20 15:12:33;
  29.   binding state active;
  30.   next binding state free;
  31.   rewind binding state free;
  32.   hardware ethernet 40:16:9f:7c:74:e7;
  33.   uid "\001@\026\237|t\347";
  34.   option agent.remote-id 0:25:f1:fd:90:7a;
  35.   client-hostname "NatRouter";
  36. }
复制代码
我想指定删除lease区域内含有20:dc:e6:3c:7f:4b的整个lease {}区域,有没有方法能实现?sed/perl/awk等方法都可以。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2014-05-21 20:28 |只看该作者
  1. #!perl

  2. use 5.010;

  3. my $text = join "", <DATA>;

  4. $text =~ s/(lease\s+[\d+\.]+\s+\{.*?\})/match_mac($1)/xmsge;
  5. say $text;

  6. sub match_mac {
  7.     my $match_text = shift;
  8.     if ($match_text =~ /20:dc:e6:3c:7f:4b/) {
  9.         return "";
  10.     }
  11.     else { return $match_text }
  12. }

  13. __DATA__
  14. lease 10.108.215.134 {
  15.   starts 2 2014/05/20 13:46:14;
  16.   ends 3 2014/05/21 13:46:14;
  17.   cltt 2 2014/05/20 13:46:14;
  18.   binding state active;
  19.   next binding state free;
  20.   rewind binding state free;
  21.   hardware ethernet 6c:e8:73:ad:32:db;
  22.   uid "\001l\350s\2552\333";
  23.   option agent.remote-id 0:23:ed:22:69:a2;
  24.   client-hostname "WR740N";
  25. }
  26. lease 10.108.215.140 {
  27.   starts 2 2014/05/20 13:46:21;
  28.   ends 3 2014/05/21 13:46:21;
  29.   cltt 2 2014/05/20 13:46:21;
  30.   binding state active;
  31.   next binding state free;
  32.   rewind binding state free;
  33.   hardware ethernet 20:dc:e6:3c:7f:4b;
  34.   uid "\001 \334\346<\177K";
  35.   option agent.remote-id a4:7a:a4:73:6e:1e;
  36.   client-hostname "WR740N";
  37. }
  38. lease 10.108.215.148 {
  39.   starts 2 2014/05/20 15:12:33;
  40.   ends 3 2014/05/21 15:12:33;
  41.   cltt 2 2014/05/20 15:12:33;
  42.   binding state active;
  43.   next binding state free;
  44.   rewind binding state free;
  45.   hardware ethernet 40:16:9f:7c:74:e7;
  46.   uid "\001@\026\237|t\347";
  47.   option agent.remote-id 0:25:f1:fd:90:7a;
  48.   client-hostname "NatRouter";
  49. }
复制代码

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
3 [报告]
发表于 2014-05-21 20:51 |只看该作者
能用一行实现吗?
比如:perl -e "xxxxxx$MACxxxxx"
其中$MAC是一个MAC地址的变量。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2014-05-21 22:24 |只看该作者
本帖最后由 104359176 于 2014-05-21 22:24 编辑

  1. $ perl -0777 -ne 's/(lease\s+[\d+\.]+\s+\{.*?\})/$1=~m{20:dc:e6:3c:7f:4b}?"":$1/xmsge;
  2. print' data.txt
复制代码

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
5 [报告]
发表于 2014-05-22 09:06 |只看该作者
本帖最后由 iceblood 于 2014-05-22 09:13 编辑

  1. MAC="20:dc:e6:3c:75:4d"                             
  2. #perl -0777 -ne 's/(lease\s+[\d+\.]+\s+\{.*?\})/$1=~m{20:dc:e6:3c:75:4d}?"":$1/xmsge;print' tt.txt
  3. perl -0777 -ne 's/(lease\s+[\d+\.]+\s+\{.*?\})/$1=~m{$ENV{'MAC'}}?"":$1/xmsge;print' tt.txt
复制代码
运行失败……请问我怎么样才能把MAC这个变量代入进去?并且让tt.txt的内容直接修改掉,并不需要将内容打印出来。

论坛徽章:
2
巨蟹座
日期:2014-05-21 16:42:40巳蛇
日期:2014-05-22 08:44:29
6 [报告]
发表于 2014-05-22 13:18 |只看该作者
回复 2# 104359176
  1. my $text = join "", <DATA>;
复制代码
这一行code的作用是什么呢?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2014-05-22 22:36 |只看该作者
回复 6# skyyy90


    就是把 <DATA> 里的数据合并成一个大字符串。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
8 [报告]
发表于 2014-05-22 22:41 |只看该作者
本帖最后由 104359176 于 2014-05-22 22:43 编辑

回复 5# iceblood


    我不明白你为什么非要一行搞定,还要用 shell 传递变量。

    > MAC="...."
    > perl filter.pl $MAC file.txt 这种形式不行吗?

论坛徽章:
1
金牛座
日期:2014-05-29 15:55:47
9 [报告]
发表于 2014-05-23 09:23 |只看该作者
104359176 发表于 2014-05-22 22:41
回复 5# iceblood

代入已经成功了。
是这么回事,因为我的基本脚本是shell,如果不能用perl -e这样的解决,就相当于我还需要额外再启用一个脚本。

论坛徽章:
2
巨蟹座
日期:2014-05-21 16:42:40巳蛇
日期:2014-05-22 08:44:29
10 [报告]
发表于 2014-05-23 16:48 |只看该作者
回复 7# 104359176


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP