免费注册 查看新帖 |

Chinaunix

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

perl如何合并多行为一行?门外汉求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-01 14:31 |只看该作者 |倒序浏览
我完全是门外汉,最近有一个文档要处理,如何用perl来做?谢谢了
一个文本文件里有多行如下,数量不定
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead {display:none;}');};
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#footer_win {display:none;}');};
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mainad {display:none;}');};
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mt5.recommend {display:none;}');};
Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD {display:none;}');};
Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggSideBox {display:none;}');};
…………
要合并为如下
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead, #footer_win, .mainad, .mt5.recommend {display:none;}');};
Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD, .ggSideBox {display:none;}');};

论坛徽章:
0
2 [报告]
发表于 2011-12-01 15:52 |只看该作者
帮你写下吧:
  1. use strict;
  2. use warnings;

  3. my %h;
  4. while (<DATA>) {
  5. next if /^\s*$/;
  6. /amscript_cd\("(.*?)"\)\)\{__amscript_wc\('(.*?)\s+\{/;
  7. $h{$1}.=$2.',';
  8. }

  9. foreach my $k (keys %h) {
  10. chop (my $v=$h{$k});
  11. printf "%s%s%s%s%s\n",q|Lif(__amscript_cd("|,$k,q|")){__amscript_wc('|,$v,q| {display:none;}');};|;
  12. }

  13. __END__
  14. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead {display:none;}');};
  15. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#footer_win {display:none;}');};
  16. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mainad {display:none;}');};
  17. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mt5.recommend {display:none;}');};
  18. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD {display:none;}');};
  19. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggSideBox {display:none;}');};
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
3 [报告]
发表于 2011-12-01 16:21 |只看该作者
本帖最后由 rubyish 于 2011-12-01 19:47 编辑

另一种写法:
~
~
  1. my ( $a, $b, $c ) = <> =~ /(.*_wc\(')(.*)(\s\{.*)/;
  2. print $a, $b;
  3. my $tmp = $a;
  4. while (<>) {
  5.     ( $a, $b ) = /(.*_wc\(')(.*)(?:\s\{.*)/;
  6.     print $tmp eq $a ? ", " . $b : $c . "\n" . $a . $b;
  7.     $tmp = $a;
  8. }
  9. print $c;
复制代码
.
.
短一点的版本:
.
  1. my ( $a, $b, $c, $d, $tmp ) = ('') x 5;
  2. while (<>) {
  3.     ( $a, $b, $c ) = /(.*_wc\(')(.*)(\s\{.*)/;
  4.     print $tmp eq $a ? ", " . $b : $d . $a . $b;
  5.     ( $tmp, $d ) = ( $a, $c . "\n" );
  6. }
  7. print $c;
复制代码
.
.

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 太赞了!!!

查看全部评分

论坛徽章:
2
金牛座
日期:2013-09-06 09:16:182015年迎新春徽章
日期:2015-03-04 09:53:17
4 [报告]
发表于 2011-12-01 16:40 |只看该作者
回复 2# x9x9


    q| 和 |是什么意思?

论坛徽章:
0
5 [报告]
发表于 2011-12-01 16:41 |只看该作者
我将一些非匹配字段用变量代替,但匹配时却匹配不到,只得使用s转转换一下(line10、line17),为什么我用的是单引但特殊字符在匹配的时候仍旧不行呢?
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my $head = q/Lif(__amscript_cd("/;
  6. my $midd = q/")){__amscript_wc('/;
  7. my $tail = q/ {display:none;}');};/;

  8. s/([()"'])/\\$1/g for ($head,$midd,$tail);
  9. my %line;
  10. while (<DATA>) {
  11.         if (/$head(\S+)$midd(\S+)$tail/) {
  12.                 push @{ $line{$1} },$2;
  13.         }
  14. }
  15. s/\\([()"'])/$1/g for ($head,$midd,$tail);

  16. while (my($k,$v) = each %line) {
  17.         print $head . $k . $midd . join(',',@{$v}) . $tail ."\n";
  18. }

  19. __DATA__
  20. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead {display:none;}');};
  21. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#footer_win {display:none;}');};
  22. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mainad {display:none;}');};
  23. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mt5.recommend {display:none;}');};
  24. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD {display:none;}');};
  25. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggSideBox {display:none;}');};
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-12-01 16:58 |只看该作者
回复  x9x9


    q| 和 |是什么意思?
nixiaoweihunter 发表于 2011-12-01 16:40


相当于单引号,因为你要处理的文本里有单引号,为了避免Perl错误解析所以这么写。
当然你可以写成q@@,或是q##都可以,具体写成什么看你要处理的文本里最好没那个字符。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-07-31 14:52 |只看该作者
回复 3# rubyish
大神, 这种写法是什么含义, 请指点, 谢谢...
my ( $a, $b, $c ) = <> =~ /(.*_wc\(')(.*)(\s\{.*)/;


   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
8 [报告]
发表于 2016-07-31 21:20 |只看该作者
本帖最后由 sunzhiguolu 于 2016-07-31 21:21 编辑

我也来一个,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($ID, $tail) = ("", "");
  5. while (<DATA>){
  6.     my ($id, $item) = /([^']+')(\S+)/;
  7.     $tail = $' if ($tail eq "");
  8.     if ($ID eq  ""){
  9.         $ID = $id;
  10.         print $ID, $item;
  11.         next;
  12.     }
  13.     $ID eq $id ? do {print ', ', $item; next} : print ($tail, ($ID = $id), $item);
  14. }

  15. print $tail;

  16. __DATA__
  17. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead {display:none;}');};
  18. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#footer_win {display:none;}');};
  19. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mainad {display:none;}');};
  20. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mt5.recommend {display:none;}');};
  21. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD {display:none;}');};
  22. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggSideBox {display:none;}');};
复制代码
perl abc.pl
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead, #footer_win, .mainad, .mt5.recommend {display:none;}');};
Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD, .ggSideBox {display:none;}');};

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-07-31 21:42 |只看该作者
本帖最后由 sunzhiguolu 于 2016-07-31 21:44 编辑

再来,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($ID, $tail) = ("", "");
  5. while (<DATA>){
  6.     my ($id, $item) = /([^']+')(\S+)/;
  7.     print $ID eq $id ? do {$tail ne "" ? ", $item" : ""} : "$tail$id$item";
  8.     $tail = $' if ($tail eq "");
  9.     $ID = $id;
  10. }
  11. print $tail;

  12. __DATA__
  13. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead {display:none;}');};
  14. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#footer_win {display:none;}');};
  15. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mainad {display:none;}');};
  16. Lif(__amscript_cd("www.xizi.com")){__amscript_wc('.mt5.recommend {display:none;}');};
  17. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD {display:none;}');};
  18. Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggSideBox {display:none;}');};
复制代码
perl abc.pl
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Lif(__amscript_cd("www.xizi.com")){__amscript_wc('#closead, #footer_win, .mainad, .mt5.recommend {display:none;}');};
Lif(__amscript_cd("gougou.com")){__amscript_wc('.ggAD, .ggSideBox {display:none;}');};
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP