支持正则表达式的文本文件批量替换工具

以前见过很多文本文件批量替换工具,也用过很多文本文件批量替换工具,但功能都不令人满意。最严重的问题就是不支持正则表达式。

站长们肯定也有很多人用过,一般在网站被挂木马时用来替换掉挂马的代码。

如果所有的文件里挂马的代码都一样,以前那些替换工具完全可以胜任。
但是后来我发现很多网站被挂马时每个文件里挂的代码不一样,比如,文件一里挂的代码是
程序代码 程序代码
<script alt="541515" src=http://www.muma.com/muma.js></script>
但是文件2里木马挂的代码却是
程序代码 程序代码
<script alt="541525" src=http://www.muma.com/muma.js></script>
文件3里……

总之每个文件里挂的代码都有一点不一样的地方,这样就导致那些替换工具无能为力:他们只能替换普通的字符串。

当时很想有一个支持正则表达式的批量替换工具,支持正则的话上面这样挂的木马很轻松就能处理掉。但是找了很久都没有找到,要么能批量,但不支持正则;要么支持正则,但不能批量。

这几天正好在研究C#字符串和正则表达式的问题,于是研究了几天,做出了这个东西。感谢Friedl、感谢Nagel,感谢他们让我了解C#和正则表达式。





正则表达式的功能是非常强大的。就像很多读过Friedl的书的人说的一样,很多自以为很了解正则表达式的人其实只了解了一点正则表达式的皮毛,但是这点皮毛就能让你体验到正则表达式的强大。
下面给两个站长们可能用的着的例子:

正则表达式应用实例:
1.删除文件中所有引用www.muma.com网站的JS的脚本或框架代码
勾选正则表达式,查找字符串:
程序代码 程序代码
<(script|iframe) +[^>]*www.muma.com[^>]*>[^<]*</\1>
替换为空

此正则可以删除掉任何形式的框架或JS引用了muma.com文件的代码。

2.删除如上文所提的JS挂马代码<script alt="541515" src=http://www.muma.com/muma.js></script><script alt="541525" src=http://www.muma.com/muma.js></script>
查找字符串
程序代码 程序代码
<script alt=\"[\d]*\" src=http://www.muma.com/muma.js></script>
替换为空

运行环境:
引用内容 引用内容
本软件只能运行于 Microsoft .NET Framework 2.0 或者更高版本环境


下载地址:





评论: 10 | 引用: 0 | 查看次数: -
回复回复aych[2011-04-15 09:47 AM | del]
引用来自 aych 引用来自 aych
万分感谢,终于搞定!

用这个正则式删除后会留下空行,本来又想来麻烦大虾的,无意中在正则式结尾按了下回车,即让正则式下面有一个空行,文本处理结果就不会留下空行了,故上来报喜,让跟我一样菜鸟的又有这种需要的参考一下,再次感谢大虾!!!
回复回复aych[2011-04-13 07:44 AM | del]
万分感谢,终于搞定!
回复回复aych[2011-04-13 00:12 AM | del]
引用来自 aych 引用来自 aych
大虾你好,首先非常感谢你开发这个实用的工具,我想删除文本里面的类似这样的
2011年01月 - 收到 16元.
2011年02月 - 收到 06元.
2011年03月 - 收到 06元.
2011年04月 - 收到 10元.
能否帮我写个正则表达式,万分感谢!
一想千开 于 2011-04-12 07:24 PM 回复
[19|20][0-9]{2}年(1[012]|0[1-9])月 - 收到[0-9]+元\.

用这个试试

非常感谢你及时的回复,但这个正则表达式不行,但还是万分感谢!
回复来自 一想千开 的评论 一想千开 于 2011-04-13 00:29 AM 回复
(19|20)[0-9]{2}年(1[012]|0[1-9])月 - 收到 [0-9]+元\.
试试这个,我用你提供的文本测试没问题了,之前的有点小错误.
这个能准确匹配正确日期,1900--2099年之间月份的正确数据,像
2011年13月 - 收到 10元.
这样的无效月份不会被匹配
回复回复aych[2011-04-12 11:44 AM | del]
大虾你好,首先非常感谢你开发这个实用的工具,我想删除文本里面的类似这样的
2011年01月 - 收到 16元.
2011年02月 - 收到 06元.
2011年03月 - 收到 06元.
2011年04月 - 收到 10元.
能否帮我写个正则表达式,万分感谢!
回复来自 一想千开 的评论 一想千开 于 2011-04-12 07:24 PM 回复
[19|20][0-9]{2}年(1[012]|0[1-9])月 - 收到[0-9]+元\.

用这个试试
回复回复onlylove[2011-02-10 06:35 PM | del]
谢谢你的软件了  以前我编了一个 比较简单  当时的需求只是文本文件  不过现在没有了  希望你能够增加一个小功能 就是比较有规律的一类文件  文件名师乱七八糟的  但是文件里面的某一行内容恰是文件名  希望你能够同时修改一下文件名  
回复回复winstarst[2010-11-25 08:10 PM | del]
千开,你好,自从发现你的正则批量替换后就一直在用,但最近遇到一个问题,在替换utf8格式的文本时,有的时候会造成文本乱码,并且会修改文件的编码方式,不知道能不能抽时间修订一下,如果需要文件样本的话,我可以提供。

还有就是如果文件没有扩展名就不支持替换,搞得替换时还要先批量添加上扩展名才行。

感谢你谢了那么方便的软件,希望能更上一层楼。

winstarst@gmail.com
回复来自 一想千开 的评论 一想千开 于 2010-11-26 04:00 AM 回复
嗯,谢谢支持,确实有很多地方需要改进了,明天给你邮件
回复回复john[2010-09-11 09:57 PM | del]
你好,软件不错。不过有个问题,建议你在下一版本解决一下。
我想处理"*.h"和"*.c"的文件,但是程序要求"*."后面至少两位后缀。
这个问题能否改进一下?
回复回复lm[2010-01-31 01:19 AM | del]
这个工具的“.”号是否不能匹配换行符?
回复来自 一想千开 的评论 一想千开 于 2010-01-31 01:29 AM 回复
是的,只作用于一行。这个需求倒真是没考虑到,非常感谢提醒^_^。下个版本可以计划加上这个选项。不过估计这选项容易让一般用户迷惑或者更容易出错。
回复回复jimmy[2009-08-05 10:08 PM | del]
这个软件的备份功能好像是把文件夹里面所有的打开的文件都备份了,能只备份替换过的吗?如果被替换的字符串和替换的字符串一样能正确的替换吗?
回复来自 一想千开 的评论 一想千开 于 2009-08-05 10:56 PM 回复
不是的,是只有被改变内容的文件才会被备份。给你看一部分源码:
if (oldcontent != newcontent)
{
    if (newexecute.UseBak)
    {
        myDoTxtFile.CopyBak();
    }
    //…………此处省略N行……
}
当旧内容和执行替换后的内容不同,且选中了备份框,文件才会被备份。

如果被替换的字符串和替换的字符串一样能正确的替换吗?
不能被替换,因为替换后的内容和替换前的内容一样,程序会认为没有内容被替换,放弃写入文件直接跳到下一个文件。
回复回复Jimmy[2009-08-02 11:23 AM | del]
不错的,是否能加个log功能呢?就是替换了哪些文件,或者是哪些文件替换了几个匹配字符串?
回复来自 一想千开 的评论 一想千开 于 2009-08-02 03:44 PM 回复
感谢您的建议,会在下一版本中考虑加入此功能
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.