LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1182|回复: 6

求一个批量文件替换文本的脚本

[复制链接]
发表于 2006-4-6 10:00:13 | 显示全部楼层 |阅读模式
小弟不才,看了半天精华区都没有整出个所以然来,我把小弟的需求写一下

有大量的.c和.h文件
我还有一个replace.txt文件,
#cat replace.txt
aaa bbb
ccc ddd
eee fff
.........


我的目的是:把所有.c和.h文件中的aaa->bbb  ccc->ddd eee->fff

哪位DX帮个忙给个例子或提示也行啊
发表于 2006-4-6 11:17:49 | 显示全部楼层
cat replaces.txt | awk '{print "mv -f " $0}' >replaces.sh
sh repalces.sh
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 11:21:40 | 显示全部楼层
哦,不好意思,我的描述有点问题。
aaa ccc 等字符串是.c和.h文件里的文本,不是文件名,嘿嘿,DX再帮看看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-6 11:21:56 | 显示全部楼层
哦,不好意思,我的描述有点问题。
aaa ccc 等字符串是.c和.h文件里的文本,不是文件名,嘿嘿,DX再帮看看
回复 支持 反对

使用道具 举报

发表于 2006-4-6 12:15:36 | 显示全部楼层

  1. sed -i 's/aaa/bbb/g' *.c |sed -i 's/ccc/ddd/g'|sed -i 's/eee/fff/g'
复制代码

呵呵,我想我可能还是没有明白你的意思!
回复 支持 反对

使用道具 举报

发表于 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 的实现方法。

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

  4. my %replace_table;
  5. open(RPL,'replace.txt') or die $!;
  6. while (<RPL>) {
  7.     chomp;
  8.     my ($a, $b) = split(/\s+/, $_);
  9.     $replace_table{$a} = $b;
  10. }
  11. close RPL;

  12. # 下面是正则表达式中使用的模式字符串
  13. my $replace_regx = join('|', keys(%replace_table));

  14. my @files = glob('*.[ch]');
  15. foreach my $file (@files) {
  16.       open(TMP,'>afoeifaewifa') or die $!;        # 临时文件,好一点的办法是用 File::Temp 模块
  17.     open(FILE, $file) or die $!;
  18.     while (<FILE>) {
  19.         s/$replace_regx/$replace_table{$1}/g;
  20.         print TMP $_;
  21.     }
  22.     close FILE;
  23.     close TMP;

  24.     unlink($file) && rename('afoeifaewifa', $file);
  25. }
复制代码

我没有测试,也没有仔细想,基本思路就是这样,若有什么bug可稍微修改一下,
不知道当替换规则复杂一些的时候会不会出问题。
这里考虑的主要是循环替换,也就是有规则:test=>testfile   file=>data 的时候,
当 test 被替换为 testfile 后, testfile 不应该被再次替换为 testdata。
谁有更好的办法贴出来 share 一下  :sleep
回复 支持 反对

使用道具 举报

发表于 2006-4-7 10:15:12 | 显示全部楼层
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帮个忙给个例子或提示也行啊


  1. # cat substitute
  2. #!/bin/sh

  3. exec < replace.txt
  4. while read from to
  5. do
  6.         sed -i "s/$from/$to/g" $1
  7. done
  8. exec < /dev/tty
  9. # cat find_replace
  10. #!/bin/sh

  11. find . -name "*.[ch]" -exec substitute {} \;
  12. # find_replace
  13. #
复制代码

替换当前目录下的c文件和h文件
试了一下,可行
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表