|
发表于 2006-4-6 22:41:47
|
显示全部楼层
Post by chinesefox
小弟不才,看了半天精华区都没有整出个所以然来,我把小弟的需求写一下
有大量的.c和.h文件
我还有一个replace.txt文件,
#cat replace.txt
aaa bbb
ccc ddd
eee fff
.........
我的目的是:把所有.c和.h文件中的aaa->bbb ccc->ddd eee->fff
哪位DX帮个忙给个例子或提示也行啊 这个用 bash script 实现起来可能比较麻烦,
下面是 perl 的实现方法。
- #! /usr/bin/perl
- use warnings;
- use strict;
- my %replace_table;
- open(RPL,'replace.txt') or die $!;
- while (<RPL>) {
- chomp;
- my ($a, $b) = split(/\s+/, $_);
- $replace_table{$a} = $b;
- }
- close RPL;
- # 下面是正则表达式中使用的模式字符串
- my $replace_regx = join('|', keys(%replace_table));
- my @files = glob('*.[ch]');
- foreach my $file (@files) {
- open(TMP,'>afoeifaewifa') or die $!; # 临时文件,好一点的办法是用 File::Temp 模块
- open(FILE, $file) or die $!;
- while (<FILE>) {
- s/$replace_regx/$replace_table{$1}/g;
- print TMP $_;
- }
- close FILE;
- close TMP;
- unlink($file) && rename('afoeifaewifa', $file);
- }
复制代码
我没有测试,也没有仔细想,基本思路就是这样,若有什么bug可稍微修改一下,
不知道当替换规则复杂一些的时候会不会出问题。
这里考虑的主要是循环替换,也就是有规则:test=>testfile file=>data 的时候,
当 test 被替换为 testfile 后, testfile 不应该被再次替换为 testdata。
谁有更好的办法贴出来 share 一下 :sleep |
|