手机
当前位置:查字典教程网 >脚本专栏 >perl >[Perl]文字/代码批量替换工具
[Perl]文字/代码批量替换工具
摘要:Perl脚本batchReplace.pl可以用来批量替换文件中的文字/代码。可在指定目录中查找指定类型的文件,并递归检查子目录;在输出文件...

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文件下载

【[Perl]文字/代码批量替换工具】相关文章:

perl 中文处理技巧

用Perl操作Excel文档的实例代码

Perl合并文本的一段实例代码

perl 文件读写详细说明

Perl生成纯HTML代码二维码实例

求婚示爱的Perl代码之注释篇

perl处理xml的模块介绍

perl 基本语法介绍

Perl使用File::Basename获取文件扩展名的代码

perl 文件测试操作符汇总

精品推荐
分类导航