免费注册 查看新帖 |

Chinaunix

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

如何删除匹配行内的其中一个字符串? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-24 10:37 |只看该作者 |倒序浏览
5可用积分
求教~~~~~~~~~~不懂perl...特来求教有没有办法解决?。。谢谢。。。


原始文本:
xr1  n1 n2 segr M=1 w=10u l=0.5u
xr2  n11 n12 segr=1.05e3  M=1 w=12u l=10.5u
xr3  n21 n22 segr=10.2k  M=1 w=210u l=0.5u
xc1 x1 x2 cpip 1.2021e-12 M=1 W=20u  l=2u
xc1 x1 x2 cpip 2.33p  M=1 W=20u  l=2u
C1  k1 k2  cap2 1e-12 W=10u L=1u
C2 k2 k3  cap2 2.01p W=10u l=40u
处理后的文本:
xr1  n1 n2 M=1 w=10u l=0.5u
xr2  n11 n12  M=1 w=12u l=10.5u
xr3  n21 n22  M=1 w=210u l=0.5u
xc1 x1 x2 cpip  M=1 W=20u  l=2u
xc1 x1 x2 cpip  M=1 W=20u  l=2u
C1  k1 k2 1e-12 $cap2 W=10u L=1u
C2 k2 k3 2.01p $cap2 W=10u l=40u


需要进行的处理有:
1.
匹配“xr”开头且包含字符”sgr”的行,删除带有“sgr”的字符串
2.
匹配“xc”开头且包含“cpip”的行,删除“cpip”后面的字符串
3.
匹配“C”开头且包含”cap2”的行,在”cap2” 前加上字符”$”,并移到其后一字符串(数字和单位组成)的后面

[ 本帖最后由 qyaqin 于 2009-12-24 11:21 编辑 ]

最佳答案

查看完整内容

我写的,稍微复杂些,仅作参考 :wink: 运行结果如下:[ 本帖最后由 climby 于 2009-12-24 12:39 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-24 10:37 |只看该作者
我写的,稍微复杂些,仅作参考 :wink:
#! /bin/perl


my $file = "sample.txt";

open( FH, "<$file" ) or die "Open file error: $!\n";

my $cap2_flag = 0;

while ( my $line = <FH> ) {

    # start with 'xr' and with 'segr'

    if ( $line =~ /^xr.*segr.*/ ) {
        $line =~ s/segr\S*//g;
        print $line;
        next;
    }

    # start with 'xc' and with 'cpip'

    if ( $line =~ /^xc.*cpip.*/ ) {
        $line =~ s/cpip\s*(\S)+/cpip/g;
        print $line;
        next;
    }

    # start with 'C' and with 'cap2'

    if ( $line =~ /^C.*cap2.*/ ) {
        $line =~ s/cap2\s+(\S+\s*)/$1\$cap2 /;
        print $line;
        next;
    }

    if ( $cap2_flag == 1 ) {
        $line =~ s/^(\S+\s*)/$1\$cap2 /;
        print $line;
        $cap2_flag = 0;
        next;
    }

    # print the lines needn't parse

    print $line;
    
  
}
   close  FH;


运行结果如下:

  1. xr1  n1 n2  M=1 w=10u l=0.5u
  2. xr2  n11 n12   M=1 w=12u l=10.5u
  3. xr3  n21 n22   M=1 w=210u l=0.5u
  4. xc1 x1 x2 cpip M=1 W=20u  l=2u
  5. xc1 x1 x2 cpip  M=1 W=20u  l=2u
  6. C1  k1 k2  1e-12 $cap2 W=10u L=1u
  7. C2 k2 k3  2.01p $cap2 W=10u l=40u
复制代码

[ 本帖最后由 climby 于 2009-12-24 12:39 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-12-24 11:03 |只看该作者
1.
匹配“xr”开头且包含字符”sgr”的行,删除带有“sgr”的字符串
s/^(xr)(.*)segr(.*)/$1$2$3/;

2.
匹配“xc”开头且包含“cpip”的行,删除“cpip”后面的字符串
s/^(xc)(.*)cpip(.*)/$1$2/;

3.
匹配“C”开头且包含”cap2”的行,在”cap2” 前加上字符”$”,并移到其后一字符串(数字和单位组成)的后面
s/^(C.*) (.*) (cap2) (.*?) (.*)/$1$2 $4 \$$3 $5/;

[ 本帖最后由 Perl_Er 于 2009-12-24 11:43 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-12-24 11:23 |只看该作者
粘贴上来格式就变了。。。。。现已更正!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2009-12-24 11:39 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2009-12-24 12:06 |只看该作者

回复 #2 Perl_Er 的帖子

楼主给分吧

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2009-12-24 12:12 |只看该作者
  1. perl -lpe 's/^(xr.*)(\w*segr\w*\W+)/$1/; s/^(xc.*cpip\W+)([^ ]+)/$1/;s/^(C.*)(cap2\W+)([^ ]+\W+)/$1$3\$$2/;' urfile
复制代码

论坛徽章:
0
8 [报告]
发表于 2009-12-24 12:40 |只看该作者
原帖由 Perl_Er 于 2009-12-24 11:03 发表
1.
匹配“xr”开头且包含字符”sgr”的行,删除带有“sgr”的字符串
s/^(xr)(.*)segr(.*)/$1$2$3/;

2.
匹配“xc”开头且包含“cpip”的行,删除“cpip”后面的字符串
s/^(xc)(.*)cpip(.*)/$1$2/;

3 ...



这个处理结果如下:

[root@lnx33 /tmp]$ perl -lpe 's/^(xr)(.*)segr(.*)/$1$2$3/;s/^(xc)(.*)cpip(.*)/$1$2/;s/^(C.*) (.*) (cap2) (.*?) (.*)/$1$2 $4 \$$3 $5/;' test
xr1  n1 n2  M=1 w=10u l=0.5u
xr2  n11 n12 =1.05e3  M=1 w=12u l=10.5u
xr3  n21 n22 =10.2k  M=1 w=210u l=0.5u
xc1 x1 x2
xc1 x1 x2
C1  k1 k2  $cap2 1e-12  W=10u L=1u
C2 k2 k3  $cap2 2.01p  W=10u l=40u

1、红色部分,也就是等号和数字没有去掉。
2、xc开头的cpip后面部分也不见啦
3、$cap2没有跟后面字符串换换。

论坛徽章:
0
9 [报告]
发表于 2009-12-24 12:42 |只看该作者
原帖由 blackold 于 2009-12-24 12:12 发表
perl -lpe 's/^(xr.*)(\w*segr\w*\W+)/$1/; s/^(xc.*cpip\W+)([^ ]+)/$1/;s/^(C.*)(cap2\W+)([^ ]+\W+)/$1$3\$$2/;' urfile



这个的结果如下:
[root@lnx33 /tmp]$ perl -lpe 's/^(xr.*)(\w*segr\w*\W+)/$1/; s/^(xc.*cpip\W+)([^ ]+)/$1/;s/^(C.*)(cap2\W+)([^ ]+\W+)/$1$3\$$2/;' test
xr1  n1 n2 M=1 w=10u l=0.5u
xr2  n11 n12 1.05e3  M=1 w=12u l=10.5u
xr3  n21 n22 10.2k  M=1 w=210u l=0.5u
xc1 x1 x2 cpip  M=1 W=20u  l=2u
xc1 x1 x2 cpip   M=1 W=20u  l=2u
C1  k1 k2  1e-12  $cap2  W=10u L=1u
C2 k2 k3  2.01p  $cap2  W=10u l=40u


后面都很完美,只可惜红色的数字部分没有去掉哎。。。

论坛徽章:
0
10 [报告]
发表于 2009-12-24 12:58 |只看该作者
原帖由 climby 于 2009-12-24 12:37 发表
我写的,稍微复杂些,仅作参考 :wink:
#! /bin/perl


my $file = "sample.txt";

open( FH, "



这个结果完全对。。。。。。。3Q~~~

也谢谢其他各位的帮助~~~受益匪浅~~有空好好研究研究perl..很强大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP