[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-007】批处理去除指定字符前所有的0


如文本1.txt:
  1. 0000acb0h
  2. 0b0c00a000s
  3. 0000h00ga00
  4. a0000000
复制代码
通过批处理将文本所有字符串字符a前的0去除输出如下:
  1. acb0h
  2. bca000s
  3. hga00
  4. a0000000
复制代码
要求:代码简洁、高效、通用,不生成临时文件
-----------------------------------------------------
本题已有较完美的解答方案:
  见9楼pusefalse版主和本人10楼的方案。


[ 本帖最后由 batman 于 2008-8-4 17:55 编辑 ]
***共同提高***

不太完善
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (1.txt) do (
  4.     set str=%%i
  5.     set str=!str:a=#a!
  6.     for /f "tokens=1* delims=a" %%a in ("!str!") do (
  7.         set str1=%%a
  8.         set str1=!str1:0=!
  9.         set str1=!str1:#=!
  10.         set str2=%%b
  11.         set str2=a!str2:#=!
  12.         echo,!str1!!str2!
  13.     )
  14. )
  15. pause
复制代码

TOP

本帖最后由 cjiabing 于 2015-10-3 00:40 编辑
  1. @echo off
  2. for /f "tokens=1* delims=a" %%a in (1.txt) do if "%%b" neq "" (for /f "tokens=1,2* delims=0" %%i in ("%%aa") do echo %%i%%j%%k%%b) else echo a%%a
  3. pause
复制代码

测试文本
  1. 0000acb0h
  2. 0b0c00a000s
  3. 0000h00ga00
  4. a0000000
  5. 0000acb0a0h
  6. 0ab0c00a000s
  7. 0000h00ga00
  8. 00a000a0000
复制代码

结果
  1. acb0h
  2. bca000s
  3. hga00
  4. a0000000
  5. acb0a0h
  6. ab0c00a000s
  7. hga00
  8. a000a0000
复制代码
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     set a=&set n=
  4.     set "j=%%a"
  5.     for /l %%b in (0,1,50) do (
  6. set k=!j:~%%b,1!
  7. if !k!==a set n=1
  8. if defined n (
  9.    set a=!a!!k!
  10. ) else (
  11.   if not "!k!"=="0" set a=!a!!k!
  12. )
  13.   )
  14. echo;!a!
  15. )
  16. pause
复制代码
心累~努力,为了美好的明天。

TOP

  1. @echo off
  2. set str=0000acb0h
  3. :: 提取第一行A前的4个0
  4. set var=%str:~0,4%
  5. echo %str:~0,4%
  6. @echo off
  7. set str=0b0c00a000s
  8. :: 提取第二行B前面的一个0
  9. set var=%str:~0,1%
  10. :: 提取第二行C前面的一个0
  11. set var=%str:~-9,1%
  12. :: 提取A前面的二个0
  13. set var=%str:~-7,2
  14. echo %str:~0,1%
  15. echo %str:~-9,1%
  16. echo %str:~-7,2%
  17. @echo off
  18. set str=0000h00ga00
  19. :: 提取H前面的4个0
  20. set var=%str:~0,4%
  21. :: 提取G前面的二个0
  22. set var=%str:~-6,2%
  23. echo %str:~0,4%
  24. echo %str:~-6,2%
  25. @echo off
  26. set str=a0000000
  27. echo %str%
  28. echo...
  29. echo..
  30. echo.
  31. echo 这个不用提取吧...
  32. pause
复制代码

TOP

  1. @echo off & setlocal enabledelayedexpansion
  2. ::去掉任意字符前的所有0
  3. set x=a
  4. for /f "tokens=1 delims=:" %%i in ('findstr /n "::data" "%~fs0"') do set data=%%i
  5. for /f "skip=%data% delims=" %%i in (%~fs0) do (
  6. set str=%%i
  7. call :qu0 !str:%x%=a !
  8. )
  9. pause
  10. goto :eof
  11. :qu0
  12. set a=%1
  13. echo %a:0=%%2
  14. goto :eof
  15. ::data
  16. 0000acb0h
  17. 0b0c00a000s
  18. 0000h00ga00
  19. a0000000
复制代码

TOP

本帖最后由 yashuer 于 2012-7-5 17:06 编辑

请教各位大大:
为什么用awk不能完成了?
没看到上面的gawk的代码。似乎在awk中找不到分组匹配的元字符

TOP

本帖最后由 lvsehuaxue 于 2012-5-12 12:31 编辑

如果一行中含有多个a的话,9楼也不通用
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%. in (a.txt) do (
  3.    set "str=%%."
  4.    set "str1=!str:a= !"
  5.    for %%i in (!str1!) do set "var=%%i"
  6.    call set "str=%%str:!var!=%%
  7.    set "str=!str:0=!"
  8.    echo !str!!var!
  9. )
  10. pause
复制代码

TOP

本帖最后由 Taurus 于 2012-5-8 16:28 编辑

我直接用string不用1.txt了
思路該是本帖未有的
@echo off
set a=00000000000acb0hfjfkflx000000000000000000000000000000000
set a=%a:0= %&call :a %%a%%$&call set/p=%%a:~0,-1%%
:a
set a=%*&call set a=%%a: =0%%
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

回复 53# wangyunxiang


    这是大家共同的梦想,可惜梦想就是梦想...

TOP

  1. gawk "gsub(/^0*/,\"\")" 1.txt
复制代码

TOP

出错了
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (1.txt) do (
  4. set a=%%i
  5. call :sta
  6. )
  7. pause
  8. :sta
  9. set a=!a:0a=a!
  10. echo !a!|findstr "0a">nul &&goto sta
  11. echo !a!
  12. goto :eof
  13.   
复制代码

TOP

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
set a=%%i
call :sta
)
pause
:sta
set a=!a:0a=a!
echo !a!|findstr "0a">nul &&goto sta
echo !a!
goto :eof

TOP

求加分
  1. sed -e "s/^0*//" 1.txt
复制代码

TOP

回复 9# pusofalse

这句怎么解释啊 。call echo   在这里是什么意思啊?
     call,echo.%%var:0=%%a%%str%%

TOP

返回列表