返回列表 发帖

【挑战】替换*=为指定字符的批处理代码

『楼 主』: 【挑战】替换*=为指定字符的bat代码

在bat中

goto,call语句是确实比较耗时;http://bbs.bathome.net/thread-5993-1-1.html

若*,=的替换问题解决了

几乎可将所有代码的goto循环转换为for循环

现在征集最简洁最快速的代码,【当然不能含有goto或call命令了】

测试字符串:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

将*替换为星星
将=替换为等号

有挑战者请上擂台。。。,
1

评分人数

谁能解决,我以后在论坛称谁为


         擂王

[ 本帖最后由 plp626 于 2009-10-12 19:15 编辑 ]

TOP

回复 2楼 的帖子

大家都是这么想的~~
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

还有2个字符:~!

[ 本帖最后由 zqz0012005 于 2009-10-12 19:31 编辑 ]
1

评分人数

    • plp626: 确实,心有灵犀啊PB + 6
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

我先说下,如果if 逐一判断字符,那么势必要先确定字符串的长度,这个花费时间在3.5个时间单位,
【1个时间单位规定为1个set赋值所耗费的时间】
然后if 判断,但是
预处理一个for ..或 if .. 或 else ... 相当于0.5~0.6个set命令的花费时间
对于一个120个字符串长度的代码至少要耗费3.5+120*0.6=75+个时间单位
所以这个并不是很理想的代码,【当然要比goto的方法快N倍】

如果有直接set赋值的代码,那么则是质的飞跃
但是这得大家挖掘预处理机制,对^!%充分利用

TOP

抛砖引玉!
@echo off
set @*=星
set @:=帽
set "@~=眉"
set "@=叹"
set cr=^
set "str=测试字符串:*/*\**,.=*,...=///&+wodfdfd**~~!!==...**:::::*************==========..."
setlocal enabledelayedexpansion
set ti=%time%
for /l %%a in (0,1,100) do (
for /f %%b in ("!str:~%%a,1!") do (
if defined @%%b (
set s=!s!!@%%b!
) else (
if "%%b" equ "=" (set s=!s!等) else (set s=!s!%%b)
)
set n=%%a
)
)
echo !s!!cr!
echo 原串有:!n!个字符!cr!
call :etime !ti! !time! ab
echo 用时:!ab!毫秒!cr!
pause
:etime <begin_time> <end_time> <return> by plp626 on bathome
rem 所测试任务的执行时间不超过1天 // 骨瘦如柴版
setlocal&set be=%~1:%~2&set cc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c&set dy=-8640000
for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>>31")&exit/bCOPY
3

评分人数

    • 尘丶: 学习了技术 + 1
    • wankoilz: 学习了,充分利用了!!和%%b容纳特殊字符的特 ...PB + 3
    • plp626: 谢谢参与,不过现在还不能叫你擂王PB + 6

TOP

回复 4楼 的帖子

额,那个,  
1、还有^ 的 而且当^在最后面,又没有双引号,
就会变成连接下一句,
2、还有奇数个双引号~


这个信息是给4楼的内容添加的。

[ 本帖最后由 523066680 于 2009-10-12 20:46 编辑 ]
[url=][/url]

TOP

我发一个无聊点的版本上来...
debug不会用...
@echo off & setlocal EnableDelayedExpansion
echo "*/*\**,.=*,...=///&+wodfdfd**==...***************==========...">1.txt
for /f "tokens=* " %%i in ("1.txt") do set "Size=%%~zi"
for /l %%i in (1,1,%size%) do set "wen=!wen!@"
echo !wen!>2.txt
if exist 3.txt del 3.txt
for /f "skip=1 tokens=1,2,3 " %%i in ('fc /b 1.txt 2.txt') do echo %%j>>3.txt
for /f "tokens=* " %%i in (3.txt) do set "out=!out!%%i "
set "out=%out:22=31%"
set "out=%out:3D=32%"
set "out=%out:26=33%"
set "out=%out:2F=34%"
set "out=%out:2.txt=%"
set /a "x=%size% / 16"
set /a "y=100"
echo @echo off>1.cmd
echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>1.cmd
echo copy/b/y $tmp$ "a.txt"^>nul>>1.cmd
echo del/a/f/q $tmp$>>1.cmd
echo goto:eof>>1.cmd
for /l %%i in (1,1,%x%) do (
        echo e0!y! !out:~0,48!>>1.cmd
        set "out=!out:~48!"
        set /a "y=!y!+10"
        )
        echo e0!y! !out!>>1.cmd
echo rcx>>1.cmd
echo !y!>>1.cmd
echo n$tmp$>>1.cmd
echo w>>1.cmd
echo q>>1.cmd
start "" "1.cmd"
for /f "tokens=* " %%i in (a.txt) do if not defined a set "a=%%i"
echo 字符串%a%
pauseCOPY

TOP

回复 7楼 的帖子

你说的那几个在开启变量延迟后不存在问题。

当考虑所有特殊字符时,肯定是要开启变量延迟的。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

小弟上个月写过类似的东西,是可以改文件的
所以由读取外部文件下手
先存一個  test.txt  ,  內容為
*/*\**,.=*,...=///&+wodfdfd**==...***************==========...COPY
然後運行
@echo off
for /f "delims=" %%a in ('type test.txt') do (call :_1 "%%a")
:_1
setlocal enabledelayedexpansion
set "word=%~1"
if not defined word (echo !fix_word! & pause & exit)
if "!word:~0,1!"=="*" (set fix_word=!fix_word!* & call :_1 "!word:~1!") else (
if "!word:~0,1!"=="=" (set fix_word=!fix_word!= & call :_1 "!word:~1!") else (
set "fix_word=!fix_word!!word:~0,1!" & call :_1 "!word:~1!") )COPY
突然看到...不能有call....
可能嗎 = =a?
~_~好像不是很理想的方法.....

[ 本帖最后由 strong12345 于 2009-10-18 08:13 编辑 ]

TOP

群里有人讨论sed,我贴一下:
C:\Test>type a.txt
:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

C:\Test>sed -e "s/\*/星星/g"  -e "s/=/等号/g" a.txt
:星星/星星\星星星星,.等号星星,...等号///&+wodfdfd星星星星等号等号...星星星星星星星星星星星星星星星
星星星星星星星星星星星星星星星等号等号等号等号等号等号等号等号等号等号...

TOP

原帖由 HAT 于 2009-10-18 13:08 发表
群里有人讨论sed,我贴一下:
C:\Test>type a.txt
:*/*\**,.=*,...=///&+wodfdfd**==...***************==========...

C:\Test>sed -e "s/\*/星星/g"  -e "s/=/等号/g" a.txt
:星星/星星\星星星星,.等号星星 ...


如果用sed我也不会提出这个问题了


本贴为cmd技术探讨而发帖

http://www.cn-dos.net/forum/viewthread.php?tid=49028&fpage=4
@echo off&setlocal enabledelayedexpansion
set "str=*/*\**,.=*,...=///&+wodfdfd**==...***************==========..."
set ss=&for /l %%a in (0 1 120)do if "!str:~%%a,1!"=="*" (set "ss=!ss!*") else if "!str:~%%a,1!"=="=" (set "ss=!ss!﹦") else if "!str:~%%a,1!" neq "" set "ss=!ss!!str:~%%a,1!"
echo !ss!&pauseCOPY
这个是那边联盟的代码,综合简洁+效率,目前也就只能这样

但我始终没有放弃"一招致死"的代码,雷王的位子还在,等待高人去占

[ 本帖最后由 plp626 于 2009-10-27 21:44 编辑 ]

TOP

只能说特殊字符是批处理的痛!!!

[ 本帖最后由 batman 于 2009-11-27 01:26 编辑 ]
***共同提高***

TOP

12楼那个代码,如果有个:,可能就麻烦了

TOP

我真的好想把它做出来
@echo off
set /p=>hlw1.txt<nul

TOP

返回列表