Board logo

标题: 【挑战】替换*=为指定字符的批处理代码 [打印本页]

作者: plp626    时间: 2009-10-12 18:41     标题: 【挑战】替换*=为指定字符的批处理代码

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

在bat中

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

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

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

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

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

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

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

作者: plp626    时间: 2009-10-12 19:14

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


         擂王

[ 本帖最后由 plp626 于 2009-10-12 19:15 编辑 ]
作者: zqz0012005    时间: 2009-10-12 19:22     标题: 回复 2楼 的帖子

大家都是这么想的~~
作者: zqz0012005    时间: 2009-10-12 19:28

还有2个字符:~!

[ 本帖最后由 zqz0012005 于 2009-10-12 19:31 编辑 ]
作者: plp626    时间: 2009-10-12 19:32

我先说下,如果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赋值的代码,那么则是质的飞跃
但是这得大家挖掘预处理机制,对^!%充分利用
作者: netbenton    时间: 2009-10-12 19:56

抛砖引玉!
  1. @echo off
  2. set @*=星
  3. set @:=帽
  4. set "@~=眉"
  5. set "@=叹"
  6. set cr=^
  7. set "str=测试字符串:*/*\**,.=*,...=///&+wodfdfd**~~!!==...**:::::*************==========..."
  8. setlocal enabledelayedexpansion
  9. set ti=%time%
  10. for /l %%a in (0,1,100) do (
  11. for /f %%b in ("!str:~%%a,1!") do (
  12. if defined @%%b (
  13. set s=!s!!@%%b!
  14. ) else (
  15. if "%%b" equ "=" (set s=!s!等) else (set s=!s!%%b)
  16. )
  17. set n=%%a
  18. )
  19. )
  20. echo !s!!cr!
  21. echo 原串有:!n!个字符!cr!
  22. call :etime !ti! !time! ab
  23. echo 用时:!ab!毫秒!cr!
  24. pause
  25. :etime <begin_time> <end_time> <return> by plp626 on bathome
  26. rem 所测试任务的执行时间不超过1天 // 骨瘦如柴版
  27. setlocal&set be=%~1:%~2&set cc=(%%d-%%a)*360000+(1%%e-1%%b)*6000+1%%f-1%%c&set dy=-8640000
  28. for /f "delims=: tokens=1-6" %%a in ("%be:.=%")do endlocal&set/a %3=%cc%,%3+=%dy%*("%3>>31")&exit/b
复制代码

作者: 523066680    时间: 2009-10-12 20:44     标题: 回复 4楼 的帖子

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


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

[ 本帖最后由 523066680 于 2009-10-12 20:46 编辑 ]
作者: flyinspace    时间: 2009-10-12 22:56

我发一个无聊点的版本上来...
debug不会用...
  1. @echo off & setlocal EnableDelayedExpansion
  2. echo "*/*\**,.=*,...=///&+wodfdfd**==...***************==========...">1.txt
  3. for /f "tokens=* " %%i in ("1.txt") do set "Size=%%~zi"
  4. for /l %%i in (1,1,%size%) do set "wen=!wen!@"
  5. echo !wen!>2.txt
  6. if exist 3.txt del 3.txt
  7. for /f "skip=1 tokens=1,2,3 " %%i in ('fc /b 1.txt 2.txt') do echo %%j>>3.txt
  8. for /f "tokens=* " %%i in (3.txt) do set "out=!out!%%i "
  9. set "out=%out:22=31%"
  10. set "out=%out:3D=32%"
  11. set "out=%out:26=33%"
  12. set "out=%out:2F=34%"
  13. set "out=%out:2.txt=%"
  14. set /a "x=%size% / 16"
  15. set /a "y=100"
  16. echo @echo off>1.cmd
  17. echo more +5 "%%~0"^|debug^&graftabl 936^>nul>>1.cmd
  18. echo copy/b/y $tmp$ "a.txt"^>nul>>1.cmd
  19. echo del/a/f/q $tmp$>>1.cmd
  20. echo goto:eof>>1.cmd
  21. for /l %%i in (1,1,%x%) do (
  22.         echo e0!y! !out:~0,48!>>1.cmd
  23.         set "out=!out:~48!"
  24.         set /a "y=!y!+10"
  25.         )
  26.         echo e0!y! !out!>>1.cmd
  27. echo rcx>>1.cmd
  28. echo !y!>>1.cmd
  29. echo n$tmp$>>1.cmd
  30. echo w>>1.cmd
  31. echo q>>1.cmd
  32. start "" "1.cmd"
  33. for /f "tokens=* " %%i in (a.txt) do if not defined a set "a=%%i"
  34. echo 字符串%a%
  35. pause
复制代码

作者: zqz0012005    时间: 2009-10-12 23:19     标题: 回复 7楼 的帖子

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

当考虑所有特殊字符时,肯定是要开启变量延迟的。
作者: strong12345    时间: 2009-10-18 02:37

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

[ 本帖最后由 strong12345 于 2009-10-18 08:13 编辑 ]
作者: HAT    时间: 2009-10-18 13:08

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

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

作者: plp626    时间: 2009-10-27 21:41

原帖由 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
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=*/*\**,.=*,...=///&+wodfdfd**==...***************==========..."
  3. 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!"
  4. echo !ss!&pause
复制代码
这个是那边联盟的代码,综合简洁+效率,目前也就只能这样

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

[ 本帖最后由 plp626 于 2009-10-27 21:44 编辑 ]
作者: batman    时间: 2009-11-27 01:23

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

[ 本帖最后由 batman 于 2009-11-27 01:26 编辑 ]
作者: caruko    时间: 2010-3-30 11:28

12楼那个代码,如果有个:,可能就麻烦了
作者: todayambition    时间: 2010-4-12 18:10

我真的好想把它做出来
作者: plp626    时间: 2011-5-27 20:20

目前,直接替换法:
我还是=无法替换
连续的*~无法替换;
但是对于*~前见个字符发现可以替换:
  1. set str1=123 *56789 *abcd ****
  2. set str2=123 ~56789 ~abcd ~~~~
  3. echo %str1: *=#%
  4. echo %str2: ~=$%
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2