中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 如何实现批量替换? 上一主题 | 下一主题
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『楼 主』:  如何实现批量替换?

有一堆代码,要全部替换为相应的汉字。

比如:按原来速度演奏<1F04><A13A><A13B><A13C>

                                      就         可          以         了


后面的代码分别代表一个汉字,替换后就成了:“按原来速度演奏就可以了.”
这样的代码有足足6千多个,不可能依次替换的,但是我有对照表,可否利用那个对照表写个什么脚本,把相应的代码替换为汉字呢?

对照表以如下形式表示
<1F04> 就
<A13A> 可
<A13B> 以
<A13C> 了


2008-5-27 16:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 2 楼』:  

可是可以,但效率肯定有问题的。
另请楼主贴一段原码上来,好研究下该如何替换好。



批处理之家新域名:www.bathome.net
2008-5-27 16:52
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 3 楼』:  

只能替换了 有什么其他办法呢



简单!简单!再简单!
2008-5-27 17:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 4 楼』:  很麻烦,但还是可以实现:

注:a.txt为要转换的文本,b.txt为对照表文本。
@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!
[ Last edited by zw19750516 on 2008-5-27 at 05:44 PM ]



批处理之家新域名:www.bathome.net
2008-5-27 17:27
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  


@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"
)
change.exe
http://upload.cn-dos.net/img/427.zip



2008-5-27 17:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 6 楼』:  



  Quote:
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  ...

谢谢!
拜托大侠能写个注释吗?我昨天才刚认识批处理,还不是太熟悉,想通过这些个对我有用的实例来学习

2008-5-27 18:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 7 楼』:  



  Quote:
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 ]



批处理之家新域名:www.bathome.net
2008-5-27 20:49
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 8 楼』:  



  Quote:
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 : ...

感谢感谢!!我会自己试试看的

2008-5-27 23:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 9 楼』:  

6千……多……还是VBS快些=。=



S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2008-5-27 23:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  

试着用 Perl 写了一个,有 Perl 环境的话可以试试:
#! 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;


2008-5-28 03:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 11 楼』:  

@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 (b.txt) do set str=!str:%%a=%%b!
echo !str!

   此帖被 +5 点积分      点击查看详情   
评分人:【 bat-zw 分数: +5  时间:2008-5-28 10:02




心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-5-28 03:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by slore at 2008-5-27 11:25 PM:
6千……多……还是VBS快些=。=

VBS不会啊,学一个都够呛的了

2008-5-28 09:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 13 楼』:  



  Quote:
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>{
    next if $l ...

感谢感谢,听说perl对文本操作很强,不知道难不难哦,不过话说回来,对于我这样的平民百姓来讲,学好一个就够用了吧。

2008-5-28 09:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xipx
初级用户




积分 62
发帖 25
注册 2008-5-27
状态 离线
『第 14 楼』:  



  Quote:
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  ...

谢谢提供多种思路,虽然现在还不太理解

2008-5-28 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 15 楼』:  



  Quote:
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 ]



批处理之家新域名:www.bathome.net
2008-5-28 10:05
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: