免费注册 查看新帖 |

Chinaunix

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

求助用perl脚本对文件数组进行编辑 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2016-07-02 20:14 |只看该作者
回复 10# sunzhiguolu


   多谢了!看懂了不少,不过还是有一个最后的那个,$_, $1 + 1,请问是什么意思啊?

论坛徽章:
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
12 [报告]
发表于 2016-07-02 20:28 |只看该作者
回复 11# 3009203267
while (<DATA>){
    if (s/(\d+\K)-thumb.*\n/.html/){
        #$_ 完成替换后 01_010_001.html
        printf (qq(<page file="%s">%03d</page>\n), $_, $1 + 1);
    }
}

__DATA__
01_010_001-thumb.jpg


   

论坛徽章:
0
13 [报告]
发表于 2016-07-02 20:54 |只看该作者
回复 12# sunzhiguolu


    谢谢你啊!还得麻烦你一下,不过又出现了一个问题,
<page file="02_010_039.html">040</page>
<page file="02_010_040.html">041</page>
<page file="02_010_041.html">042</page>
<page file="02_020_001.html">002</page>
<page file="02_020_002.html">003</page>
<page file="02_020_003.html">004</page>
<page file="02_020_004.html">005</page>
当数字往前移的时候,计数又回从头开始,这是哪里的问题呢?

论坛徽章:
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
14 [报告]
发表于 2016-07-02 21:02 |只看该作者
回复 13# 3009203267
这样的话, 就给它一个固定的数值.
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $num = 2;
  5. while (<DATA>){
  6.     if (s/-thumb.*\n/.html/){
  7.         printf (qq(<page file="%s">%03d</page>\n), $_, $num++);
  8.     }
  9. }

  10. __DATA__
  11. 01_010_007-thumb.jpg
  12. 01_010_001.html
  13. 01_010_002-thumb.jpg
  14. 01_010_002.html
  15. 01_010_001-thumb.jpg
  16. 01_010_003.html
  17. 01_010_008-thumb.jpg
  18. 01_010_004.html
  19. 01_010_001-thumb.jpg
  20. 01_010_005.html
  21. 01_010_006-thumb.jpg
  22. 01_010_006.html
复制代码
perl a.pl
-----------------------------------------------
<page file="01_010_007.html">002</page>
<page file="01_010_002.html">003</page>
<page file="01_010_001.html">004</page>
<page file="01_010_008.html">005</page>
<page file="01_010_001.html">006</page>
<page file="01_010_006.html">007</page>


   

论坛徽章:
0
15 [报告]
发表于 2016-07-02 21:19 |只看该作者
回复 14# sunzhiguolu


    多谢指点!虽然printf的语法还是不太清楚

论坛徽章:
0
16 [报告]
发表于 2016-07-02 21:35 |只看该作者
回复 1# 3009203267
  1. sub walk{
  2.         my ($file,$count,$word,$code) = @_;
  3.         my $fh;
  4.         open $fh, $file or die "couldn't open $file: $!";
  5.         while(<$fh>){
  6.                 chomp;
  7.                 s/^\s+//;
  8.                 if(/$word/){
  9.                         $code->($count,$_);
  10.                         $count++;
  11.                 }
  12.         }
  13.         close $fh;
  14.         return 1;  
  15. }

  16. sub format{
  17.         my ($count, $line) = @_;
  18.         if($line =~ /(.+)-.+\.jpg/){
  19.                 printf "<page file=\"$1.html\">%003d<\/page>\n", $count;
  20.         }
  21.        
  22. }

  23. # usage: walk(your file, start number, 'match word', \&format)
  24. walk('your file',1, 'thumb', \&format);

复制代码

论坛徽章:
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
17 [报告]
发表于 2016-07-02 21:41 |只看该作者
回复 15# 3009203267
找了几个小例子, 看下就明白了.
%s a string
%d a signed integer, in decimal

printf '<% d>', 12; # prints "< 12>"
    printf '<%+d>', 12; # prints "<+12>"
    printf '<%6s>', 12; # prints "< 12>"
    printf '<%-6s>', 12; # prints "<12 >"
    printf '<%06s>', 12; # prints "<000012>"
    printf '<%#o>', 12; # prints "<014>"
    printf '<%#x>', 12; # prints "<0xc>"
    printf '<%#X>', 12; # prints "<0XC>"
    printf '<%#b>', 12; # prints "<0b1100>"
    printf '<%#B>', 12; # prints "<0B1100>"



   

论坛徽章:
0
18 [报告]
发表于 2016-07-04 16:10 |只看该作者
回复 17# sunzhiguolu


    十分感谢!

论坛徽章:
0
19 [报告]
发表于 2016-07-04 16:43 |只看该作者
回复 17# sunzhiguolu


    想再问您一下,如何判断-thumb之前的字符是数字还是英文字符呢,我分别用了\s和\d都没有区别开来
~ s/(\d+\K)-thumb.jpg/.html/g;
~ s/(\s+\K)-thumb.jpg/.html/g;
这两个的结果都是一样的,如果thumb之前有数字,又有英文字符,如何区分开来呢?

论坛徽章:
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
20 [报告]
发表于 2016-07-04 16:49 |只看该作者
本帖最后由 sunzhiguolu 于 2016-07-04 16:50 编辑
3009203267 发表于 2016-07-04 16:43
回复 17# sunzhiguolu
这两个的结果都是一样的,如果thumb之前有数字,又有英文字符,如何区分开来呢?

贴出几条示例数据, 同时将你想要的结果贴出来. 这样可以看的更清楚些, 谢谢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP