免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: plabgh
打印 上一主题 下一主题

perl中如何将匹配上的多行内容打印到文件中? [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-27 14:10 |只看该作者 |倒序浏览
您好!咨询您一个perl的问题。
$oldname文件的文本内容如下所示:

.data section layout
Starting        Virtual   File
address Size address offset
---------------------------------

.sbss2 section layout
Starting        Virtual   File
address Size address offset
---------------------------------

.bss section layout
Starting        Virtual   File
address Size address offset
---------------------------------
00000000 00000c 400013


我想把$oldname文件中.data section layout以下,.bss section layout以上的内容全部通过print打印到文件$newname中,该如何操作?
我用下面的代码试了,没搞定。

open(OLDFILE, $oldname) || die "Error\n";
undef $/;
$OldFileString = <OLDFILE>;
$/ = "\n";
close(OLDFILE);

@lines = split(/\n/, $OldFileString );
open(NEWFILE, (">>" . $newname)) || die "Error\n";
foreach $line (@lines) {
if($line =~ (/.data section layout/../.bss section layout/)){
print NEWFILE "$line\n";
}
}
close(NEWFILE);
不知道为什么$newname文件中打印的为什么不是我想要的内容,而是整个$oldname文件的内容拷贝,求各位指道。
谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-08-27 14:39 |只看该作者
回复 1# plabgh


    if 里面的条件要写成 $line =~ /\.data section layout/ .. $line =~ /\.bss section layout/

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
3 [报告]
发表于 2015-08-27 14:51 |只看该作者
如果我想匹配的是.data section layout以下,Memory Map:以上的文本内容,那么其中匹配冒号':',是不是该在冒号前面也加一个反斜杠?
是不是 $line =~ /Memory Map\:/  这样???
谢谢
回复 2# MMMIX


   

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
4 [报告]
发表于 2015-08-27 15:20 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;

  3. open(IN,"<$oldname");
  4. open (OUT,">$newname");
  5. my $flag=0;
  6. while(<IN>){
  7.         chomp;
  8.         if($_ eq '.data section layout'){
  9.                 $flag=1;
  10.         }elsif($_ eq '.bss section layout'){
  11.                 $flag=0;
  12.         }
  13.         if($flag){
  14.                 print OUT "$_\n";
  15.         }
  16. }
  17. close IN;
  18. close OUT;
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
5 [报告]
发表于 2015-08-27 19:07 |只看该作者
高手,麻烦您有空了帮我看看这个问题,谢谢。
http://bbs.chinaunix.net/thread-4186561-1-1.html
回复 2# MMMIX


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
6 [报告]
发表于 2015-08-28 09:14 |只看该作者
回复 2# MMMIX

按照你的意思,应该下面的写法就行吧?但是.data和.sbss2这两行也打印出来了,怎么去掉他们呢
    while(<DATA>){
print if(/\.data section layout/../\.sbss2 section layout/);
}

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2015-08-28 09:56 |只看该作者
回复 6# xiaoxingan99


    碰到它们不打印就是了.

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
8 [报告]
发表于 2015-08-28 11:41 |只看该作者
回复 7# MMMIX


    再加一层if对吧?谢谢!
我以为有别的参数可以直接干掉呢

论坛徽章:
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-09-09 10:36 |只看该作者
  1. perl -ne '$P=1 if(/\A\.data section layout/);$P=0 if(/\A\.bss section layout/);print if($P)' f
复制代码

论坛徽章:
0
10 [报告]
发表于 2016-09-16 12:36 |只看该作者
直接这样好了~
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. open OUTPUT, '>', 'newname.txt'
  5.         or die "Can't output the file: $!";
  6. while (<>) {
  7.         chomp;
  8.         next if (/.data section layout/);
  9.         last if (/.bss section layout/);
  10.         print OUTPUT $_, "\n";       
  11. }
  12. close OUTPUT;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP