免费注册 查看新帖 |

Chinaunix

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

perl如何批量替换文本? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-03-29 15:41 |只看该作者 |倒序浏览
本帖最后由 xiaomm250 于 2018-03-29 15:43 编辑

比如在一个文件夹下面,有一批文件的文件名都是以GLZ开头的,
想把这些以GLZ开头的文件内容实现把所有的aaa替换成bbb,
把所有的xxx替换成yyy,
把所有的mmm替换成nnn,
不知道如何操作?
我的操作系统是win8

文件名如下,只替换那些以GLZ开头的,文件很多,只列举了一小部分.
DZPMXZ.90
GCMC.90
GLZBQ4DQ-XK01.90
GLZBQ4DQ-XK02.90
GLZBQHT-XAQK01.90
GLZBQHT-XAQK02.90
GLZBQHT-XDQK01.90
GLZBQHT-XDQK02.90
GLZBQHT-XGBPZK01.90



论坛徽章:
0
2 [报告]
发表于 2018-03-30 15:57 |只看该作者
ls GLZ* |xargs sed 's/xxx/yyy/g'
ls GLZ* |xargs sed 's/mmm/nnn/g'

论坛徽章:
0
3 [报告]
发表于 2018-03-31 10:40 |只看该作者
回复 2# dahe_1984

我想用perl脚本,不用命令行命令行不好,不容易维护下次使用
不容易添加注释
没缩进

论坛徽章:
0
4 [报告]
发表于 2018-03-31 13:57 |只看该作者

找到所有GLZ*文件放进数组,遍历文件每行,匹配替换被。

如果你发个红包,我估计很多人抢着帮你写。

呵呵,我肯定不抢。

论坛徽章:
0
5 [报告]
发表于 2018-03-31 15:17 |只看该作者
#!usr/bin/perl
use File::Slurp;

my ($dir)=@ARGV;

my @paths = read_dir($dir);

foreach (@paths)
{
         chomp;
         if($_=~m/^GLZ/)
         {
                         my $fpth=$dir."\\".$_;
                         open my $f, $fpth or die $!;
                         while(<$f>)
                         {
                                 s/aaa/bbb/g;
                                 s/xxx/yyy/g;
                                 s/xxx/yyy/g;
                         }
                         close $f;                        
         }

}

论坛徽章:
0
6 [报告]
发表于 2018-03-31 15:17 |只看该作者
本帖最后由 TrishaTie 于 2018-03-31 15:18 编辑

不知道对不对,你再调一下,我这只是基础尝试

论坛徽章:
0
7 [报告]
发表于 2018-03-31 20:45 |只看该作者
回复 6# TrishaTie

请问一个问题,对于同一个文件,为什么你能读取文件又修改文件?
暂时没测试过你的代码.

我的经验是同一个文件句柄下,不可以又读取文件,又修改文件.

论坛徽章:
0
8 [报告]
发表于 2018-03-31 20:51 |只看该作者
dahe_1984 发表于 2018-03-31 13:57
找到所有GLZ*文件放进数组,遍历文件每行,匹配替换被。

如果你发个红包,我估计很多人抢着帮你写。

其实我自己已经写出来了.
use strict;use warnings;use diagnostics;
my @files=glob("GLZ*.90");#读取所有的文件名,此处文件必须以GLZ开头,后缀名是90
foreach my $file (@files)
{
    #先打开读取文件内容,保存到数组里面
    open(my $FHa,'<',$file);
    my @data=<$FHa>;
    close($FHa);
    #再打开文件,然后把文件清除空,然后往里面写入修改后的内容
    open(my $FHb,'>',$file);
    foreach my $line (@data)
    {
        #需要做哪些修改
        #按照实际工程修改
        $line=~s/^3,,\d*,\d*,/3,,50,150,/g;
        print $FHb $line;
    }
    close($FHb);
}


我一时没贴出来,就想看看有没有更好的代码?
我不喜欢命令行,命令行不好调试,命令行不好添加注释,命令行不好修改,命令行不好下次修改利用,
命令行不好下次维护利用.
我一般都是写脚本,然后写注释,有缩进,在Windows上,我只要双击一下脚本就解决问题了.
好维护,好添加注释,好修改.好保存

论坛徽章:
0
9 [报告]
发表于 2018-03-31 20:55 |只看该作者
楼上的写的比你的好。

尤其是大文件,你这种估计得卡死。

你可以测试不同文件,看看楼上的和你写的谁的速度快?

论坛徽章:
0
10 [报告]
发表于 2018-03-31 21:04 |只看该作者
dahe_1984 发表于 2018-03-31 20:55
楼上的写的比你的好。

尤其是大文件,你这种估计得卡死。

我是perl菜鸟,我弄的都是小文件,一般不到1000行,就几十个
为了重复利用,我才想到写脚本,我想打赏楼上的结果打赏不了,
至少我觉得他让我知道了如何处理大文件,他的代码有点看不懂,
因为没注释,而且喜欢用默认变量,我自己基本不用默认变量,
因为我怕时间长了,自己维护不了自己的代码



001.png (57.54 KB, 下载次数: 68)

001.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP