免费注册 查看新帖 |

Chinaunix

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

问题求助 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-15 10:44 |只看该作者 |倒序浏览
我看了篇帖子, 内容如下:
我希望匹配出关键字sem的行内容,追加到下一个关键字sem前的行首

文本
sem 1234
point 23 33
point 25 aa
point 23 sd
point 19 fd
sem 5412
point 13 tt
point 12 oq
point 12 iw
sem 4513
point 142 iws
point 142 amx


效果

sem 1234 point 23 33
sem 1234 point 25 aa
sem 1234 point 23 sd
sem 1234 point 19 fd
sem 5412 point 13 tt
sem 5412 point 12 oq
sem 5412 point 12 iw
sem 4513 point 142 iws
sem 4513 point 142 amx

我的代码如下:

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

  4. my $sStr = do {local $/ = undef; <>};
  5. my @aData;
  6. $sStr =~ s!^(sem\s+\d+)\n(.*?)(?=sem|\z)!do{push(@aData,"$1 $_\n") for (split /\n/,$2);splice(@aData)}!gsme;
  7. print $sStr;
复制代码
输出结果, 总是有问题:
sem 1234 point 19 fd
sem 5412 point 12 iw
sem 4513 point 142 amx

论坛徽章:
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
2 [报告]
发表于 2016-05-15 10:52 |只看该作者
我的解题思路:
1.> 匹配部分 => 每次匹配 以行开头为 sem 并且以数字结尾的记录保存到 $1 中, 并且匹配任何内容直到遇到 sem 或 结束符 保存到 $2 中
2.> 替换部分 => 用 \n 分割 $2 得到一个列表, 将列表中的每个元素 与 $1 合并填充到 @aData 数组中, 直到列表循环结束. 返回 @aData 的值

但是, 看结果好像结果只保存了 最后一条记录. 我的问题描述完了, 还请大家指点, 谢谢大家...

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2016-05-15 10:54 |只看该作者
本帖最后由 jason680 于 2016-05-15 10:55 编辑

回复 1# sunzhiguolu

$ perl -lane '{if(m/^sem/){$H=$_;next}print "$H $_"}' FILE
sem 1234 point 23 33
sem 1234 point 25 aa
sem 1234 point 23 sd
sem 1234 point 19 fd
sem 5412 point 13 tt
sem 5412 point 12 oq
sem 5412 point 12 iw
sem 4513 point 142 iws
sem 4513 point 142 amx


   

论坛徽章:
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
4 [报告]
发表于 2016-05-15 11:00 |只看该作者
找到问题了,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $sStr = do {local $/ = undef; <>};
  5. my @aData;
  6. $sStr =~ s!^(sem\s+\d+)\n(.*?)(?=sem|\z)!do{push(@aData,"$1 $_\n") for (split /\n/,$2);join("",splice(@aData))}!gsme;
  7. print $sStr;
复制代码
sem 1234 point 23 33
sem 1234 point 25 aa
sem 1234 point 23 sd
sem 1234 point 19 fd
sem 5412 point 13 tt
sem 5412 point 12 oq
sem 5412 point 12 iw
sem 4513 point 142 iws
sem 4513 point 142 amx

大家能告诉我一下原因吗, splice 函数不是一次将 @aData 的内容返回吗, 谢谢大家...

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2016-05-15 11:03 |只看该作者
回复 2# sunzhiguolu

$sStr =~ s!^(sem\s+\d+)\n(.*?)(?=sem|\z)!do{push(@aData,"$1 $_\n") for (split /\n/,$2);splice(@aData)}!gsme;
   
一个简单替换s/old/new/....做这么多事.....出问题

论坛徽章:
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
6 [报告]
发表于 2016-05-15 11:10 |只看该作者
回复 5# jason680
大神, 您说的出问题, 能否明示, 谢谢您... (我没有弄明白您的意思)

   

论坛徽章:
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-05-15 11:14 |只看该作者
回复 3# jason680
大神, 还有个问题向您请教. 您在使用 perl 一行代码时 变量命名 有啥规则吗?
比如: $H 是大写的形式, 您能说下在哪种情况下 变量用大写 反之 用小写形式命名. 谢谢您...

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-05-15 11:28 |只看该作者
回复 6# sunzhiguolu

问题在“思路”......
s/old/new/
简单的事情,就简单做就好了...

one line command用完就丢......
(别管什么命名)
%h,$h{...},
count => c or C
data  => d or D
head => H
Last  =>?
   

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 嘿嘿, 又向大神学了一招!

查看全部评分

论坛徽章:
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-05-15 11:47 |只看该作者
回复 8# jason680
明白了, 谢谢您指点.
还有个问题向您请教, 关于 替换部分的 splice 函数返回值的问题, 之所以每次得到的是最后一对组合 是不是因为前面的哪些值都被 splice 函数的下一个值给替换掉了啊, 还请您指点, 谢谢您...

   

论坛徽章:
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
10 [报告]
发表于 2016-05-15 12:11 |只看该作者
另外, 这个问题还有其他的解决方法吗, 还请大家指点, 谢谢大家...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP