Board logo

标题: 【练习-007】批处理去除指定字符前所有的0 [打印本页]

作者: batman    时间: 2008-8-1 22:37     标题: 【练习-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 编辑 ]
作者: pusofalse    时间: 2008-8-2 00:12

********************
屏蔽,看错题意了。

[ 本帖最后由 pusofalse 于 2008-8-2 04:20 编辑 ]
作者: null    时间: 2008-8-2 01:15

我失败了,但我有个问题
我的测试代码如下:
  1. @echo off
  2. for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
  3. set a=%%i
  4. set a=%a:0=%
  5. echo %a%a%%j
  6. )
复制代码


结果为:
  1. acb0h
  2. a000s
  3. a00
  4. a
复制代码


在CMD中运行
set a=0b0c00a000s
set a=%a:0=%
echo %a%
的结果正常,显示为:bcas
为什么在上面的测试代码中结果却全部变没了呢?
作者: pusofalse    时间: 2008-8-2 04:05

原帖由 null 于 2008-8-2 01:15 发表
我失败了,但我有个问题
我的测试代码如下:
@echo off
for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
set a=%%i
set a=%a:0=%
echo %a%a%%j
)

结果为:

acb0h
a000s
a00
a


在CMD中运行
...

你的这两个代码输出的结果是理所当然的。第一个因为没有开启变量延迟,即使开启了,输出的结果也不会正确。
第二个。你测试如下代码。
  1. set a=0b0c00a000s&echo %a%
  2. pause
复制代码
保存为bat。运行,你会发现a的值并不是你所想的那样,而是显示echo处于关闭状态。
这是因为CMD命令解释器在读到set a=0b0c00a000s&echo %a%这一条完整的语句时,发现a用%%闭合,是个变量,会把它替换成之前所赋给它的字符串常量,并把它打印出来。而在这条完整的语句之前并没有给a赋值,即是空值。所以才会显示echo处于关闭状态。请理解“一条完整的语句”的意思。
set a=0b0c00a00s&echo %a% 这才是一条完整的语句。
同样的,for语句中给a赋值,然后又在for中引用%a%,在这之前,CMD早就把它替换为空值了,所以你的代码会出错。
如何避免这种出错呢,要用到变量延迟了。
setlocal enabledelayedexpansion 这条语句的意思即是开启变量延迟。它的作用就是要告诉CMD,在读到一条完整的语句时,不要急匆匆地扩展变量。而是在执行复合语句(for语句或if语句中其后用一对圆括号闭合的所有语句称为复合语句,用&或&&连接的也是复合语句。)中的某单条语句之后,再执行变量的扩展,也就是说,这个变量扩展的行为被延后了。在开启延迟之后,在for中给变量a赋值,又在for中引用a,此时,就不应用%%将其闭合了,而是用!!。
你的代码应该是这样。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
  3. set a=%%i
  4. set a=!a:0=!
  5. echo !a!a%%j
  6. )
  7. pause
复制代码
但输出的结果仍不符合楼主的要求,这就要看你的了。

还要记得,如果在复合语句之外再次引用变量,此时它的值是在复合语句之内最后得到的值。
如下代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (100 1 199) do set var=%%a&echo !var:~1!
  3. echo %var%
  4. pause
复制代码
关于变量延迟,搜索一下,多做测试很快就能明白了,我说的很粗糙。

[ 本帖最后由 pusofalse 于 2008-8-2 04:06 编辑 ]
作者: null    时间: 2008-8-2 11:07     标题: 回复 4楼 的帖子

我明白了,十分感谢!
作者: batman    时间: 2008-8-2 12:00

提示一下:
  开启变量延迟是我们常用的方法,但大家想一想本题是不是可以不开变量延迟?
作者: batman    时间: 2008-8-3 13:36

我们出题目的目的在于让大家都活跃下思路,在设法解题的过程中能得到提高。

本题确实不难,希望大家充分利用好每次出题的机会来提高自己,同时也可获
得一定的积分奖励(当然这并不是目的所在)。
作者: ieutk    时间: 2008-8-3 14:32

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "usebackq skip=12 delims=" %%a in ("%~dpnx0") do (
  3.         set "var=%%a"
  4.         set "var=!var:a=a#!"
  5.         for /f "tokens=1* delims=#" %%i in ("!var!") do (
  6.                  set "eo1=%%i"&set "eo2=%%j"
  7.                  set "eo1=!eo1:0=!"
  8.                  set "eo2=!eo2:#=!"
  9.                  echo.!eo1!!eo2!
  10.             )
  11.     )
  12. pause&goto :eof
  13. 0000acb0ha0
  14. 0b0c00a000s
  15. 0000h00ga00
  16. a0000000a
  17. a00d0sa000d0a0
复制代码

[ 本帖最后由 ieutk 于 2008-8-3 15:09 编辑 ]
作者: pusofalse    时间: 2008-8-3 18:40

  1. @echo off
  2. for /f "delims=" %%. in (1.txt) do (
  3.    set "str=%%."
  4.    call,set "str=%%str:*a=%%"
  5.    for /f "delims=a" %%{ in ("%%.") do (
  6.          set "var=%%{"
  7.         call,echo.%%var:0=%%a%%str%%
  8.   ))
  9. pause>nul
复制代码


来个怪异的。^_^
作者: batman    时间: 2008-8-4 17:52

我的解:
  1. @echo off
  2. for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
  3.      if "%%j" neq "" (
  4.         set "str=%%i"
  5.         call,set "str=%%str:0=%%"
  6.         call,echo %%str%%a%%j
  7.         ) else (
  8.         echo a%%i
  9.      )
  10. )
  11. pause>nul
复制代码

作者: more    时间: 2008-8-5 11:55

如果测试文本如下,要求去除第一个a前的0,那么只有9楼的代码成功:
  1. 0000acb0a0h
  2. 0ab0c00a000s
  3. 0000h00ga00
  4. 00a000a0000
复制代码

[ 本帖最后由 more 于 2008-8-5 11:59 编辑 ]
作者: batman    时间: 2008-8-5 12:56

批处理之所以如此得到大家的青睐,是因为它可以现写现用很方便,
同时从一另一层面上就要求我们具体问题具体对待,相信谁也不会
回为要解决一个普通的问题而写出一个适合出所有此类问题的代码
吧,如真要这样做,在时间上的损耗将是一笔无可估量的损失,我
们也会因此而得不偿失。
作者: ieutk    时间: 2008-8-5 13:36

如果测试文本如下,要求去除第一个a前的0,那么只有9楼的代码成功


用11楼提供的字符经测试,8,9楼代码都通过,10楼没有通过


批处理之所以如此得到大家的青睐,是因为它可以现写现用很方便,
同时从一另一层面上就要求我们具体问题具体对待,相信谁也不会
回为要解决一个普通的问题而写出一个适合出所有此类问题的代码
吧,如真要这样做,在时间上的损耗将是一笔无可估量的损失,我
们也会因此而得不偿失。


呵呵,说的也是,有时在写代码的时候会出现考滤问题不全而导致代码不通用。
作者: Clark2505    时间: 2008-8-5 21:20

可怜的我为什么都学不会for的用法??
各位大大怎么学的??
作者: shqf    时间: 2008-8-5 21:52

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
  3. set aftera=%%j
  4. if "!aftera!"=="" set aftera=%%i
  5. set a=%%i
  6. set a=!a:0=!
  7. echo !a!a!aftera!
  8. )
  9. pause
复制代码

[ 本帖最后由 shqf 于 2008-8-5 21:57 编辑 ]
作者: null    时间: 2008-8-6 12:30

原帖由 pusofalse 于 2008-8-3 18:40 发表
@echo off
for /f "delims=" %%. in (1.txt) do (
   set "str=%%."
   call,set "str=%%str:*a=%%"
   for /f "delims=a" %%{ in ("%%.") do (
         set "var=%%{"
        call,echo.%%var:0=%%a%%str%% ...


请高手帮忙解释一下可以吗,我对里面的一些语法不太了解
像上面的"delims="这样的分隔符是代表什么意思,还有这个%%.这又是什么意思,同样,还有下面的%%{
作者: ieutk    时间: 2008-8-6 15:12

"delims="    取消以空格作为分隔符
%%.
%%{
之类的你可以看作%%i   %%a
作者: null    时间: 2008-8-6 17:30

原帖由 ieutk 于 2008-8-6 15:12 发表
"delims="    取消以空格作为分隔符
%%.
%%{
之类的你可以看作%%i   %%a


"delims="    取消以空格作为分隔符[不太明白]
那这种形式一般是用在什么样的场合呢,具体的作用又是什么,可以结合例子说明一下吗?

感谢!
作者: huahua0919    时间: 2008-8-6 18:03

  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do (
  3. set a=%%i
  4. setlocal enabledelayedexpansion
  5. for /l %%i in (1 1 10) do (
  6. set a=!a:0a=a!
  7. )
  8. echo !a!
  9. endlocal
  10. )
  11. pause
复制代码

作者: pusofalse    时间: 2008-8-6 19:55

楼上的朋友,测试果真正确吗。
作者: pusofalse    时间: 2008-8-6 20:14

只看delim这个单词是分隔的意思。
它用在for的选项中当然就是指定分隔符的意思,看其后的s,可以指定不止一个。
举个例子就简单了。从文件中取值。
a.txt
  1. bbs bat home
复制代码
你知道从a.txt中提取出bat 是用for /f "tokens=2 delims= " %%a in (a.txt) do @echo %%a
红色那处(包括=之后的空格)可有可无,因为for 默认就是以空格或跳格或等号作为分隔符的。
以XP中文版为例,提取出当前时间,并输出如下形式yyyymmdd
for /f "tokens=1-3 delims=- " %%a in ('date/t') do @echo %%a%%b%%c
"tokens=1-3 delims=- " 取命令结果中的1-3列,看下命令结果只有两列,如何做呢,就要用delims制定分隔符了,分隔符多指定一个- 看下,不就变成4列了吗。delims=-之后有空格,否则,第三列会是这样06 星期三,而不会再以空格作为分隔符,06为当前日期。
加深。
a.txt
  1. abcdefghijkl
复制代码

只提取出hijkl
  1. for /f "tokens=2 delims=g" %%a in (a.txt) do @echo %%a
复制代码


%%{ %%.这样的非常少见,所以说怪异。
for /f "tokens=1-31" %%a in (a.txt) do echo %%a...%%z...
超过z之后要用{表示。
for中的变量顺序完全是由ASSCII码的大小来排列的。
for /f "tokens=1-3" %%" in (a.txt) do @echo %%"...
其后要用什么表示呢。
看下,"的十进制asscii为34,只需知道哪个是35,36 就可以输出第2-3列了。
十进制asscii对应35,36的分别是# $
但"是特殊字符,其前要加^转义。所以这个例子中,若全部输出1-3列,正确的应该是
  1. for /f "tokens=1-3" %%^" in (a.txt) do @echo %%^" %%# %%$
复制代码

[ 本帖最后由 pusofalse 于 2008-8-6 20:25 编辑 ]
作者: null    时间: 2008-8-7 17:32

明白了,我上面只是对"delime="不太理解,版主是个好心的同志哇,讲得这么细,感谢

昨天自己写了个测试代码运行了一下已经完全明白了。

for /f %%i in ('dir') do @echo %%i  
测试运行结果:
驱动器
卷的序列号是
C:\Documents
2008-08-05
2008-08-05
2008-04-24
2008-08-03
2008-04-24
2008-08-02
0
6

for /f "delims=" %%i in ('dir') do @echo %%i
运行结果:
驱动器 C 中的卷是 WINXP
卷的序列号是 9CAA-3031
C:\Documents and Settings\Administrator 的目录
2008-08-05  11:20    <DIR>          .
2008-08-05  11:20    <DIR>          ..
2008-04-24  18:01    <DIR>          Favorites
2008-08-03  00:50    <DIR>          Phone Browser
2008-04-24  15:29    <DIR>          「开始」菜单
2008-08-02  23:23    <DIR>          桌面
               0 个文件              0 字节
               6 个目录  6,371,704,832 可用字节

我从两个结果的对比中得到的理解即为:
不加"delims="这个参数的话,for 就会默认以空格作为分隔符(这样就只会显示左边的一列所返回的结果),加上这个参数可以取消以空格作为分隔符。
作者: null    时间: 2008-8-7 17:37

%%{ %%.这样的非常少见,所以说怪异。
for /f "tokens=1-31" %%a in (a.txt) do echo %%a...%%z...
超过z之后要用{表示。
for中的变量顺序完全是由ASSCII码的大小来排列的。
for /f "tokens=1-3" %%" in (a.txt) do @echo %%"...
其后要用什么表示呢。
看下,"的十进制asscii为34,只需知道哪个是35,36 就可以输出第2-3列了。
十进制asscii对应35,36的分别是# $
但"是特殊字符,其前要加^转义。所以这个例子中,若全部输出1-3列,正确的应该是
复制内容到剪贴板代码:

for /f "tokens=1-3" %%^" in (a.txt) do @echo %%^" %%# %%$


对于版主同去对于这部分的解释,我也明白了,十分感谢。。。

不过我也产生了一个疑问,
@echo off
for /f "delims=" %%. in (1.txt) do (
   set "str=%%."
   call,set "str=%%str:*a=%%"
   for /f "delims=a" %%{ in ("%%.") do (
         set "var=%%{"
        call,echo.%%var:0=%%a%%str%% ...
按照我的理解来说,这里的%%{  %%.跟%%a %%b并没有什么实质上的不同啊,那为什么要用在这里呢??
作者: 浅默    时间: 2008-8-7 20:32

a00000008
9楼的代码在处理上面的情况时不理想
作者: pusofalse    时间: 2008-8-7 21:35     标题: 回复 24楼 的帖子

多谢兄弟指出。我明天再来看下哪里出错了,今天太累了,不好意思。
作者: terse    时间: 2008-8-7 23:52

前面几个测试后 或多或少的有些问题  写一个
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('more/e +9 %0') do (
  3.    set "str=%%i"
  4.    call set "var=%%str:*a=!str!a%%"
  5.    call set "var=%%var:!str!=%%"
  6.    if not "!var!"=="" (
  7.    call set "var1=%%str:!var!=%%"
  8.    set "var1=!var1:0=!"&echo !var1!!var!) else echo %%i)
  9. pause>nul&exit
  10. 560000h57
  11. 0000acb0ha22a
  12. 0b0c00a00a0s
  13. 0000h00ga0a0
  14. a00000000a
  15. 0000h00g200
  16. 00000000a0a
  17. a00000000
  18. 00000000a
  19. aaaaa
复制代码

作者: youxi01    时间: 2008-8-8 00:39

去if,增强代码的健壮,测试代码:
  1. @echo off
  2. for /f "delims=" %%c in (1.txt) do (
  3. for /f "delims=a tokens=1,*" %%i in ("0%%c") do (
  4. set var=%%i
  5. call echo.%%var:0=%%a%%j
  6. ))
  7. pause>nul
复制代码

作者: youxi01    时间: 2008-8-8 00:46

不过话说回来,题目有很多细节没说清楚
如,a的个数?a的大致位置?等等问题

其实,所谓的通用代码一般都是比较累赘的,所以写的代码一般都具有很强的针对性
作者: terse    时间: 2008-8-8 13:02

原帖由 youxi01 于 2008-8-8 00:39 发表
去if,增强代码的健壮,测试代码:@echo off
for /f "delims=" %%c in (1.txt) do (
        for /f "delims=a tokens=1,*" %%i in ("0%%c") do (
                set var=%%i
                call echo.%%var:0=%%a%%j
))
pause>nul

原文本没有a的行会去掉不应去掉的0
在原文本全a的行只显一个a
作者: huahua0919    时间: 2008-8-8 13:38

我不明白为什么我的代码不正确,
只是针对你题目而已。
其实想要做到通用只要计算最长字符的长度即可。
作者: batman    时间: 2008-8-8 17:15

感谢大家对本贴的关注,其实我出这道题目的根本目的在于充分开放大家的思路,
本来去除指定字符前的0字符最保险的方法就是逐字符判断法,但这种办法的效率
是可想而知的,一旦要处理的字符量巨大的话,将会损耗我们大量的时间,所以要
求大家针对具体问题找出简洁高效的解决方案。所以对于代码是否通用性强其实并
不是我们所要考虑的主要问题,而大家所讨论的焦点无疑放在了代码的通用性上,
我认为这就偏离了我们所要研究的核心(当然并不是说代码的通用性不重要),所
以请后面跟贴的朋友将讨论重心放在思路和技巧上。
作者: keen    时间: 2009-4-26 17:23

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set v=%%i
  4.     if "!v:~0,1!"=="a" (echo !v!) else (
  5.     for /f "tokens=1,2 delims=a" %%j in ("%%i") do (
  6.         set str=%%j
  7.         set str=!str:0=!
  8.         echo !str!a%%k
  9. )))
  10. pause
复制代码

作者: keen    时间: 2009-4-26 17:34

我的思路跟10楼batman的基本一样,可是处理上,还是batman更厉害!
关键是在处理a0000000这行,batman 直接判断以a为分割后第二字段是否为空,就直接解决问题了,佩服!!!
作者: inittab    时间: 2009-4-26 17:54

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=*" %%i in (1.txt) do (
  3. set str=%%i
  4. set str1=!str:*a=a!
  5. call set tmp=%%str:!str1!=%%
  6. if not "!tmp!"=="" (call set str0=%%tmp:0=%%) else set "str0="
  7. echo !str0!!str1!
  8. )
  9. pause
复制代码


补上。

[ 本帖最后由 inittab 于 2009-4-27 09:11 编辑 ]
作者: netbenton    时间: 2009-4-26 22:19

没有if 不用for,只set 搞定,效率高,通用性:无特殊字符的各种情形均可通过。
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3.    set "str=%%i"
  4.    setlocal enabledelayedexpansion
  5.    set "a=!str:*a=a!"
  6.    set "b=!a:0=!##
  7.    set str=!str:0=!##
  8.    call echo.%%str:!b!=!a!%%
  9.    endlocal
  10. )
  11. pause
复制代码

[ 本帖最后由 netbenton 于 2009-4-27 19:12 编辑 ]
作者: everest79    时间: 2009-4-27 02:09

  1. for /f "tokens=* delims=0" %%i in (1.txt) do echo %%i
复制代码

作者: inittab    时间: 2009-4-27 09:11

ls看错题了。呵呵
我也看错。现在改正过来了。
作者: zqz0012005    时间: 2009-4-27 13:03

题目出重了。

[ 新手习题] 批处理去除字符串前所有的0
http://www.bathome.net/thread-3086-1-2.html
作者: Batcher    时间: 2009-4-27 13:22     标题: 回复 38楼 的帖子

嗯,练功区的那个是重复的吧,晚了差不多半年时间呢。

本帖发表于 2008-8-1 22:37
彼帖发表于 2009-1-15 18:46
作者: Batcher    时间: 2009-4-27 20:04     标题: 回复 42楼 的帖子

什么叫“反驳”?大家都是因为爱好批处理才走到一起的,彼此切磋才能更快提高,何来反驳之谈?谁闲着没事去到处反驳?
作者: zhouyongjun    时间: 2009-6-22 17:15

我看错了题目,只去掉a前面紧挨着的0,难度大了很多。已经写出来,就贴在这里算了
  1. @echo off&setlocal enabledelayedexpansion
  2. set "var=a b c d e f g h i j k l m n o p q r s t u v w x y z"
  3. for /f %%a in (a.txt) do (
  4.     set str=%%a
  5.     for %%b in (%var%) do (
  6.         set "str=!str:%%b= %%b !"
  7.     )
  8.     for %%c in (!str!) do (
  9.         if defined s (
  10.             if !s! neq 0 (<nul set/p=!s!) else (
  11.                 if %%c neq a <nul set/p=!s!
  12.              )
  13.         )
  14.         set "s=%%c"
  15.     )
  16.     <nul set/p=!s!&echo/&set "s="
  17. )
  18. pause
复制代码

作者: sgaizxt001    时间: 2010-6-15 05:58

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,* delims=a" %%a in (a.txt) do (
  3.   if "%%b"=="" (set stt=%%a) else (set str=%%a & set stt=%%b)
  4.   set str=!str:0=!
  5.   echo.%str%a!stt!
  6. )
  7. pause
复制代码
好像测试版主给的另外一组数据也可以

没有想到顶了老帖子了,只是发现我的这个代码还是有点意思就发了。

[ 本帖最后由 sgaizxt001 于 2010-6-15 06:08 编辑 ]
作者: Hello123World    时间: 2011-7-28 14:02

  1. @echo off&SetLocal EnableDelayedExpansion
  2. (For /f "tokens=1* delims=a" %%i in (1.txt) do (Set a=%%i
  3. Set b=!a:0=!
  4. echo !b!a%%j ))>2.txt
  5. pause
复制代码
本以为解决了,不过BatMan很坏,留了个陷阱——a0000000。

明天继续想想。
作者: zaixinxiangnian    时间: 2011-9-3 20:58

回复 9# pusofalse

这句怎么解释啊 。call echo   在这里是什么意思啊?
     call,echo.%%var:0=%%a%%str%%
作者: Seder    时间: 2011-9-3 21:28

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

作者: 545810831    时间: 2011-9-4 09:01

@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
作者: 545810831    时间: 2011-9-4 09:03

出错了
  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.   
复制代码

作者: awk    时间: 2011-9-4 18:58

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

作者: CrLf    时间: 2011-12-21 16:25

回复 53# wangyunxiang


    这是大家共同的梦想,可惜梦想就是梦想...
作者: Taurus    时间: 2012-5-8 16:18

本帖最后由 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%%

作者: lvsehuaxue    时间: 2012-5-12 12:25

本帖最后由 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
复制代码

作者: yashuer    时间: 2012-7-5 17:05

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

请教各位大大:
为什么用awk不能完成了?
没看到上面的gawk的代码。似乎在awk中找不到分组匹配的元字符
作者: jains521    时间: 2012-10-17 12:07

  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
复制代码

作者: zh_1452    时间: 2014-10-5 20:03

  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
复制代码

作者: 尘丶    时间: 2015-10-2 22:58

  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
复制代码

作者: cjiabing    时间: 2015-10-3 00:35

本帖最后由 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
复制代码

作者: qixiaobin0715    时间: 2021-3-28 13:54

不太完善
  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
复制代码





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