@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do set str=%%i&set var=&call :lp
pause>nul&goto :eof
:lp
if "!str:~,1!!str:~5,1!"=="<>" (
for /f "tokens=2 delims= " %%i in ('findstr "!str:~,6!" b.txt') do set a=%%i
set str=!str:~6!
) else (
set a=!str:~,1!&set str=!str:~1!
)
set var=!var!!a!
if defined str goto lp
echo !var!
@echo off
for /f "tokens=1,2" %%a in ('findstr .* "C:\test\b.txt"') do (
change.exe "C:\test\a.txt" /from "%%a" /to "%%b"
)
Originally posted by zw19750516 at 2008-5-27 05:27 PM: 注:a.txt为要转换的文本,b.txt为对照表文本。 [code] @echo off&setlocal enabledelayedexpansion for /f "delims=" %%i in (a.txt) do set str=%%i&set var=&call ...谢谢! 拜托大侠能写个注释吗?我昨天才刚认识批处理,还不是太熟悉,想通过这些个对我有用的实例来学习
Originally posted by xipx at 2008-5-27 18:05: 谢谢! 拜托大侠能写个注释吗?我昨天才刚认识批处理,还不是太熟悉,想通过这些个对我有用的实例来学习:D@echo off&setlocal enabledelayedexpansion 此句为关闭所有回显然后开启变量延迟。 for /f "delims=" %%i in (a.txt) do set str=%%i&set var=&call :lp 用fo循环r语句r逐行阅读a.txt里的内容并将每行字符串赋值给变量str,同时置空 上一句的变量var,并跳转到脚本标签lp处(并将变量str值传递过去)。 pause>nul&goto :eof 当所有的循环都完成暂停并在输出任意键后退出。 :lp 标签lp。 if "!str:~,1!!str:~5,1!"=="<>" ( for /f "tokens=2 delims= " %%i in ('findstr "!str:~,6!" b.txt') do set a=%%i set str=!str:~6! ) else ( set a=!str:~,1!&set str=!str:~1! ) 如果变量str的第一个字符和第六个字符为<>,则用for循环语句在b.txt中逐行查 找变量str的前六个字符(<....>),并将所在行的以 为间隔的第2组字符串赋值给 变量a,然后将变量str向后移6个位;如果如果变量str的第一个字符和第六个字符 不是<>,则将变量str的第一个字符赋值给变量a,然后将变量str向后移一个位。 set var=!var!!a! 将变量a的值追加在变量var后面。 if defined str goto lp 如果变量str不为空则返回标签lp再(将上述命令)运行一次。 echo !var! (当str经数次移位为空时)在屏幕上显示出变量var的值,然后返回前面的for循环 再次对a.txt下一行重复执行lp后的所有的命令。 ps:如楼主是刚接触批处理,可能看这段注释会有所吃力,最好对着代码边看边测 试和分析(建议用自己修改语句再测试的方法) ---------------------------------------------------------------------------------------------------------- 请仅做理解命令而用,此方法在此处不可取。 [ Last edited by zw19750516 on 2008-5-28 at 10:09 AM ]
Originally posted by zw19750516 at 2008-5-27 08:49 PM: @echo off&setlocal enabledelayedexpansion 此句为关闭所有回显然后开启变量延迟。 for /f "delims=" %%i in (a.txt) do set str=%%i&set var=&call : ...感谢感谢!!我会自己试试看的
#! perl -w
use strict;
use warnings;
open IN,'bianma.txt';
my $hash;
while(my $line=<IN>){
next if $line =~ m/^\s*$/;
chomp $line;
my @tarr=split(/\s+/,$line);
$hash->{$tarr[0]}=$tarr[1];
}
open IN2,'myfile.txt';
while(my $line=<IN2>){
$line =~ s/<[a-fA-F0-9]{4}>/$hash->{$&}/g;
print $line;
}
close IN; close IN2;
Originally posted by slore at 2008-5-27 11:25 PM: 6千……多……还是VBS快些=。=VBS不会啊,学一个都够呛的了
Originally posted by lxmxn at 2008-5-28 03:08 AM: 试着用 Perl 写了一个,有 Perl 环境的话可以试试: [code]#! perl -w use strict; use warnings; open IN,'bianma.txt'; my $hash; while(my $line=<IN>感谢感谢,听说perl对文本操作很强,不知道难不难哦,不过话说回来,对于我这样的平民百姓来讲,学好一个就够用了吧。{ next if $l ...
Originally posted by pusofalse at 2008-5-28 03:52 AM: @echo off&setlocal enabledelayedexpansion for /f "delims=" %%a in (a.txt) do ( set str=%%a call :lp ) pause>nul&goto :eof :lp for /f "tokens=1,2" %%a in ...谢谢提供多种思路,虽然现在还不太理解
Originally posted by pusofalse at 2008-5-28 03:52: @echo off&setlocal enabledelayedexpansion for /f "delims=" %%a in (a.txt) do ( set str=%%a call :lp ) pause>nul&goto :eof :lp for /f "tokens=1,2" %%a in ...兄弟的这个代码远胜于我的,是我又犯了效率错误,同时也想复杂了(本来就是一个简单的连续替换)请楼主使用此代码进行替换处理。 [ Last edited by zw19750516 on 2008-5-28 at 10:11 AM ]
Originally posted by zw19750516 at 2008-5-28 10:05 AM: 兄弟的这个代码远胜于我的,是我又犯了效率错误,同时也想复杂了(本来就是一个简单的连续替换)请楼主使用此代码进行替换处理。 [ Last edited by zw19750516 on 2008-5-28 at 10:11 AM ]呵呵,我是初学者,都看看
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (a.txt) do (
set str=%%i
set str=!str:^<= !
set str=!str:^>= !
for %%a in (!str!) do for /f "tokens=1* delims=<>" %%x in ('findstr "<%%a>" b.txt') do set str=!str:%%x=%%y!
set str=!str: =!
echo !str!
)
pause
Originally posted by pusofalse at 2008-5-28 03:52 AM: @echo off&setlocal enabledelayedexpansion for /f "delims=" %%a in (a.txt) do ( set str=%%a call :lp ) pause>nul&goto :eof :lp for /f "tokens=1,2" %%a in ...巨慢的说,那个对照表文件里有6000多行,正文文本里有多少我不知道了,但是光纯文本就有15MB作用,这样的速度恐怕要开机1个月才完事儿