Perl脚本batchReplace.pl可以用来批量替换文件中的文字/代码。可在指定目录中查找指定类型的文件,并递归检查子目录;在输出文件时复制输入文件的目录结构。
[附件]Win32应用程序batchReplace.exe是由Perl脚本编译产生的可执行程序,不需安装Perl运行环境即可执行。
在命令行中使用
batchReplace.exe[-i输入文件路径(或包含文件的目录)][-o输出文件位置(文件或目录)][-c批量输入文件的扩展名,以“.”开始,多个扩展名之间以“|”隔开][-m匹配模式][-I(忽略匹配内容的字母大小写)][-G(全局查找要匹配的内容)][-e例外的字符串,是对匹配模式的补充,如果在匹配结果中发现有这样的字符串,做不匹配处理][-r替换的内容]
上述参数没有顺序限制。当-o参数所涉及的文件路径不存在时,会自动创建。当输出文件已经存在时,文件原有的内容将被覆盖。(安全起见,请不要输出到输入文件的原始位置,以免造成不可恢复的损失。)
例如:
batchReplace.exe-id:gaoshu1-od:do123456-ehttp://www.blueidea.com/
通过配置文件batchReplace.set设置参数
配置文件中可包含以下设置项目(格式范例,注意大小写):
Input=E:fna指定输入路径,相当于命令行参数-i的默认值。
-i=E:fna同上。
Output=E:dnaWalks指定输出路径,相当于命令行参数-o的默认值。
-o=E:dnaWalks同上。
Match=<iframe[^>]*>[sS]*?</iframe>匹配模式,相当于命令行参数-m的默认值。
-m=<iframe[^>]*>[sS]*?</iframe>同上。
Insensitive忽略匹配内容的字母大小写,相当于命令行参数-I。
-I同上。
Global全局查找要匹配的内容,相当于命令行参数-G。
-G同上。
Replacement=<h1>bound0</h1>替换的内容,相当于命令行参数-r的默认值。
-r=<h1>bound0</h1>同上。
Except=http://www.blueidea.com/例外的字符串,如在匹配结果中发现有这样的字符串,做不匹配处理,相当于命令行参数-e的默认值。
-e=http://www.blueidea.com/同上。
CheckType=.htm|.html当输入参数设为目录时,处理目录中包含的具有这些扩展名的文本文件(递归检查子目录)。相当于命令行参数-c的默认值。
-c同上。
每行放置一个项目。除内容之间不要有多余的空格或引号。
除必要的输入输出外,所有的设置项目都是可选的。命令行参数会覆盖相应的默认值。如果在配置文件中不包含Match或CheckType,会启用内置的默认值(同上面示例中给出的值)。Replacement默认为空字符,将匹配内容替换为空字符,也就是将匹配内容清除。
欲在batchReplace.set中保留历史配置时,可在参数前放置任意非空白字符以取消其作用。
例如:
2007/04/06Insensitive
(此处的Insensitive将作为历史配置保留,不再生效。)
2007/04/06Replacement=<h1>bound0</h1>
(此处的Replacement=<h1>bound0</h1>将作为历史配置保留,不再生效。)
如果在配置文件的多行中出现同样的项目,以最后出现的设置为准,例如:
CheckType=.htm|.html
CheckType=.jsp
-c=.asp|.php
将设置CheckType的值为.asp|.php,也可以利用这个特性保留历史配置,方便调试。
这个脚本写得比较仓促(是挤出吃晚饭的时间写的),以后有时间我还会改进。(因此转载请注明出处,并注意更新。)
[免责声明]作者不承担用户因使用此工具而造成的任何意外损失。
perl源码
复制代码 代码如下:
#file:batchReplace.pl
#author:Bound0
#created:2007-04-06
#firstpublished:http://bbs.blueidea.com/viewthread.php?tid=2734388
my$match;
my$replacement='';
my$insensitive=0;
my$global=0;
my$gi;
my$go;
my$Checktype=".htm|.html";
my$except;
if(open(setfile,"<batchReplace.set"))
{
while(<setfile>)
{
if(/^s*-I/){$insensitive=1}
if(/^s*-G/){$global=1}
if(/^s*-m=(.+)/){$match=$1}
if(/^s*-r=(.+)/){$replacement=$1}
if(/^s*-e=(.+)/){$except=$1}
if(/^s*-i=(.+)/){$gi=$1}
if(/^s*-o=(.+)/){$go=$1}
if(/^s*-c=(.+)/){$Checktype=$1}
if(/^s*Insensitive/){$insensitive=1}
if(/^s*Global/){$global=1}
if(/^s*Match=(.+)/){$match=$1}
if(/^s*Replacement=(.+)/){$replacement=$1}
if(/^s*Except=(.+)/){$except=$1}
if(/^s*Input=(.+)/){$gi=$1}
if(/^s*Output=(.+)/){$go=$1}
if(/^s*CheckType=(.+)/){$Checktype=$1}
}
}
my$para=''.join('',@ARGV);
if($para=~/-I*/){$insensitive=1}
if($para=~/-G*/){$global=1}
my@ti=split(/-i*/,$para);
if($ti[1]){($gi)=split(/-(o|i|c|e|m|r|I|G)/,$ti[1])}
unless($gi){print"No"Inputpath"parameter!";exit}
my@to=split(/-o*/,$para);
if($to[1]){($go)=split(/-(o|i|c|e|m|r|I|G)/,$to[1])}
unless($go){print"No"Outputpath"parameter!";exit}
my@tc=split(/-c*/,$para);
if($tc[1]){($Checktype)=split(/-(o|i|c|e|m|r|I|G)/,$tc[1])}
my@te=split(/-e*/,$para);
if($te[1]){($except)=split(/-(o|i|c|e|m|r|I|G)/,$te[1])}
my@tr=split(/-r*/,$para);
if($tr[1]){($replacement)=split(/-(o|i|c|e|m|r|I|G)/,$tr[1])}
unless($match){$match="<iframe[^>]*>[sS]*?</iframe>";
$insensitive=1;
$global=1}
my@tm=split(/-m*/,$para);
if($tm[1]){($match)=split(/-(o|i|c|e|m|r|I|G)/,$tm[1])}
unless($match){print"No"MatchPattern"parameter!";exit}
my$checktyp='(';
$Checktype=~s/././g;
$Checktype=~s/|/)|(/g;
$checktyp.=$Checktype.')$';
my$excep;
if($except){
$excep=$except;
$excep=~s/////g;
$excep=~s/././g;
$excep=~s/|/|/g;
$excep=~s/[/[/g;
$excep=~s/]/]/g;
$excep=~s/(/(/g;
$excep=~s/)/)/g;
$excep=~s/$/$/g;
$excep=~s/?/?/g;
}
my$replacemen;
if($replacement){
$replacemen=$replacement;
$replacemen=~s/////g;
$replacemen=~s/././g;
$replacemen=~s/|/|/g;
$replacemen=~s/[/[/g;
$replacemen=~s/]/]/g;
$replacemen=~s/(/(/g;
$replacemen=~s/)/)/g;
$replacemen=~s/$/$/g;
$replacemen=~s/?/?/g;
}
subcFile
{
my$fi;
($fi)=@_;
if(opendir(DIR,$fi))
{
my@dir=readdir(DIR);
closedirDIR;
if(""eqsubstr$fi,(length$fi)-1){$fi=substr($fi,0,(length$fi)-1)}
my@subdirs=grep{/^(?!.)/&&-d"$fi$_"}@dir;
foreachmy$subdir(@subdirs)
{
cFile("$fi$subdir")
}
@files=grep{/$checktyp/i&&-T"$fi$_"}@dir;
foreachmy$fil(@files)
{
my$bp='';
$bp=(substr$fi,(length$gi))."";
my$bi="$fi$fil";
my$bo=$go.$bp.$fil;
remove($bi,$bo)
}
}
}
unless(""eqsubstr$go,(length$go)-1){$go.=""}
if(-d$gi)
{
unless(""eqsubstr$gi,(length$gi)-1){$gi.=""}
cFile($gi);
}
else
{
my$bu=substr$gi,(rindex$gi,'');
my$bo=$go.$bu;
remove($gi,$bo)
}
print"nProcessFinished!";
print"n-i:$gi";
print"n-o:$go";
print"n-m:$match";
if($except){print"n-e:$except"}
if($replacement){print"n-r:$replacement"}
subremove
{
my$bi;
my$bo;
($bi,$bo)=@_;
print"nprocessing$bi...n";
unless(open(INPUT,"<$bi")){print"n[Warn]Cannotopenthefile<$bi>:$!";return}
my@conts=<INPUT>;
closeINPUT;
my$cont=join'',@conts;
my$c;
if($insensitive)
{
if($global)
{
unless($cont=~s/($match)/${$c=Cexcept($1)}$c/gi){die"$!"}
}
else
{
unless($cont=~s/($match)/${$c=Cexcept($1)}$c/i){die"$!"}
}
}
else
{
if($global)
{
unless($cont=~s/($match)/${$c=Cexcept($1)}$c/g){die"$!"}
}
else
{
unless($cont=~s/($match)/${$c=Cexcept($1)}$c/){die"$!"}
}
}
unless(open(OUT,">$bo"))
{
if($!==2)
{
my$dbo=substr$bo,0,(rindex$bo,'');
if(opendir(OUTDIR,$dbo)){closedirOUTDIR;print"n[Warn]Cannotopentheoutputfile<$bo>:$!";exit}
else
{
if($!==2)
{
unless(pmkpath($dbo)){print"n[Warn]Cannotcreattheoutputdirectory<$dbo>:$!";exit}
unless(open(OUT,">>$bo")){print"n[Warn]Cannotopentheoutputfile<$bo>:$!";exit}
}
else{print"n[Warn]Cannotopentheoutputdirectory<$dbo>:$!";exit}
}
}
else{print"n[Warn]Cannotopentheoutputfile<$bo>:$!";exit}
}
printOUT"$cont";
closeOUT;
}
subpmkpath
{
my@p=split(//,shift);
my$pa=$p[0];
my$m=$#p+1;
my$t;
for($t=1;-e$pa;$t++){$pa.=''.$p[$t]}
unless(mkdir$pa){return0}
for(;$t<$m;$t++)
{
$pa.=''.$p[$t];
unless(mkdir$pa){return0}
}
return1
}
subCexcept
{
unless($except){return$replacemen}
my$con;
($con)=@_;
if($con=~/$excep/){return$con}else{return$replacemen}
}
打包的exe文件下载