返回列表 发帖

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


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


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

不太完善
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    set str=%%i
    set str=!str:a=#a!
    for /f "tokens=1* delims=a" %%a in ("!str!") do (
        set str1=%%a
        set str1=!str1:0=!
        set str1=!str1:#=!
        set str2=%%b
        set str2=a!str2:#=!
        echo,!str1!!str2!
    )
)
pauseCOPY

TOP

本帖最后由 cjiabing 于 2015-10-3 00:40 编辑
@echo off
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
pauseCOPY

测试文本
0000acb0h
0b0c00a000s
0000h00ga00
a0000000
0000acb0a0h
0ab0c00a000s
0000h00ga00
00a000a0000COPY

结果
acb0h
bca000s
hga00
a0000000
acb0a0h
ab0c00a000s
hga00
a000a0000COPY
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (1.txt) do (
    set a=&set n=
    set "j=%%a"
    for /l %%b in (0,1,50) do (
set k=!j:~%%b,1!
if !k!==a set n=1
if defined n (
   set a=!a!!k!
) else (
  if not "!k!"=="0" set a=!a!!k!
)
  )
echo;!a!
)
pauseCOPY
心累~努力,为了美好的明天。

TOP

@echo off
set str=0000acb0h
:: 提取第一行A前的40
set var=%str:~0,4%
echo %str:~0,4%
@echo off
set str=0b0c00a000s
:: 提取第二行B前面的一个0
set var=%str:~0,1%
:: 提取第二行C前面的一个0
set var=%str:~-9,1%
:: 提取A前面的二个0
set var=%str:~-7,2
echo %str:~0,1%
echo %str:~-9,1%
echo %str:~-7,2%
@echo off
set str=0000h00ga00
:: 提取H前面的40
set var=%str:~0,4%
:: 提取G前面的二个0
set var=%str:~-6,2%
echo %str:~0,4%
echo %str:~-6,2%
@echo off
set str=a0000000
echo %str%
echo...
echo..
echo.
echo 这个不用提取吧...
pauseCOPY

TOP

@echo off & setlocal enabledelayedexpansion
::去掉任意字符前的所有0
set x=a
for /f "tokens=1 delims=:" %%i in ('findstr /n "::data" "%~fs0"') do set data=%%i
for /f "skip=%data% delims=" %%i in (%~fs0) do (
set str=%%i
call :qu0 !str:%x%=a !
)
pause
goto :eof
:qu0
set a=%1
echo %a:0=%%2
goto :eof
::data
0000acb0h
0b0c00a000s
0000h00ga00
a0000000COPY

TOP

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

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

TOP

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

如果一行中含有多个a的话,9楼也不通用
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%. in (a.txt) do (
   set "str=%%."
   set "str1=!str:a= !"
   for %%i in (!str1!) do set "var=%%i"
   call set "str=%%str:!var!=%%
   set "str=!str:0=!"
   echo !str!!var!
)
pauseCOPY

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

gawk "gsub(/^0*/,\"\")" 1.txtCOPY

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
  
COPY

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

求加分
sed -e "s/^0*//" 1.txtCOPY

TOP

回复 9# pusofalse

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

TOP

返回列表