标题: 【练习-007】批处理去除指定字符前所有的0 [打印本页]
作者: batman 时间: 2008-8-1 22:37 标题: 【练习-007】批处理去除指定字符前所有的0
如文本1.txt:- 0000acb0h
- 0b0c00a000s
- 0000h00ga00
- a0000000
复制代码
通过批处理将文本所有字符串字符a前的0去除输出如下:- acb0h
- bca000s
- hga00
- 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
我失败了,但我有个问题
我的测试代码如下:
- @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
- )
复制代码
结果为:
复制代码
在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中运行
...
你的这两个代码输出的结果是理所当然的。第一个因为没有开启变量延迟,即使开启了,输出的结果也不会正确。
第二个。你测试如下代码。-
- set a=0b0c00a000s&echo %a%
- 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,此时,就不应用%%将其闭合了,而是用!!。
你的代码应该是这样。-
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
- set a=%%i
- set a=!a:0=!
- echo !a!a%%j
- )
- pause
复制代码
但输出的结果仍不符合楼主的要求,这就要看你的了。
还要记得,如果在复合语句之外再次引用变量,此时它的值是在复合语句之内最后得到的值。
如下代码:-
- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (100 1 199) do set var=%%a&echo !var:~1!
- echo %var%
- 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
- @echo off&setlocal enabledelayedexpansion
- for /f "usebackq skip=12 delims=" %%a in ("%~dpnx0") do (
- set "var=%%a"
- set "var=!var:a=a#!"
- for /f "tokens=1* delims=#" %%i in ("!var!") do (
- set "eo1=%%i"&set "eo2=%%j"
- set "eo1=!eo1:0=!"
- set "eo2=!eo2:#=!"
- echo.!eo1!!eo2!
- )
- )
- pause&goto :eof
- 0000acb0ha0
- 0b0c00a000s
- 0000h00ga00
- a0000000a
- a00d0sa000d0a0
复制代码
[ 本帖最后由 ieutk 于 2008-8-3 15:09 编辑 ]
作者: 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%%
- ))
- pause>nul
复制代码
来个怪异的。^_^
作者: batman 时间: 2008-8-4 17:52
我的解:- @echo off
- for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
- if "%%j" neq "" (
- set "str=%%i"
- call,set "str=%%str:0=%%"
- call,echo %%str%%a%%j
- ) else (
- echo a%%i
- )
- )
- pause>nul
复制代码
作者: more 时间: 2008-8-5 11:55
如果测试文本如下,要求去除第一个a前的0,那么只有9楼的代码成功:- 0000acb0a0h
- 0ab0c00a000s
- 0000h00ga00
- 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
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=a" %%i in (1.txt) do (
- set aftera=%%j
- if "!aftera!"=="" set aftera=%%i
- set a=%%i
- set a=!a:0=!
- echo !a!a!aftera!
- )
- 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
- @echo off
- for /f "delims=" %%i in (a.txt) do (
- set a=%%i
- setlocal enabledelayedexpansion
- for /l %%i in (1 1 10) do (
- set a=!a:0a=a!
- )
- echo !a!
- endlocal
- )
- pause
复制代码
作者: pusofalse 时间: 2008-8-6 19:55
楼上的朋友,测试果真正确吗。
作者: pusofalse 时间: 2008-8-6 20:14
只看delim这个单词是分隔的意思。
它用在for的选项中当然就是指定分隔符的意思,看其后的s,可以指定不止一个。
举个例子就简单了。从文件中取值。
a.txt复制代码
你知道从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
复制代码
只提取出hijkl
-
- 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列,正确的应该是-
- 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
前面几个测试后 或多或少的有些问题 写一个
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('more/e +9 %0') do (
- set "str=%%i"
- call set "var=%%str:*a=!str!a%%"
- call set "var=%%var:!str!=%%"
- if not "!var!"=="" (
- call set "var1=%%str:!var!=%%"
- set "var1=!var1:0=!"&echo !var1!!var!) else echo %%i)
- pause>nul&exit
- 560000h57
- 0000acb0ha22a
- 0b0c00a00a0s
- 0000h00ga0a0
- a00000000a
- 0000h00g200
- 00000000a0a
- a00000000
- 00000000a
- aaaaa
复制代码
作者: 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
复制代码
作者: 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
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (
- set v=%%i
- if "!v:~0,1!"=="a" (echo !v!) else (
- for /f "tokens=1,2 delims=a" %%j in ("%%i") do (
- set str=%%j
- set str=!str:0=!
- echo !str!a%%k
- )))
- pause
复制代码
作者: keen 时间: 2009-4-26 17:34
我的思路跟10楼batman的基本一样,可是处理上,还是batman更厉害!
关键是在处理a0000000这行,batman 直接判断以a为分割后第二字段是否为空,就直接解决问题了,佩服!!!
作者: inittab 时间: 2009-4-26 17:54
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=*" %%i in (1.txt) do (
- set str=%%i
- set str1=!str:*a=a!
- call set tmp=%%str:!str1!=%%
- if not "!tmp!"=="" (call set str0=%%tmp:0=%%) else set "str0="
- echo !str0!!str1!
- )
- pause
复制代码
补上。
[ 本帖最后由 inittab 于 2009-4-27 09:11 编辑 ]
作者: netbenton 时间: 2009-4-26 22:19
没有if 不用for,只set 搞定,效率高,通用性:无特殊字符的各种情形均可通过。
- @echo off
- for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- setlocal enabledelayedexpansion
- set "a=!str:*a=a!"
- set "b=!a:0=!##
- set str=!str:0=!##
- call echo.%%str:!b!=!a!%%
- endlocal
- )
- pause
复制代码
[ 本帖最后由 netbenton 于 2009-4-27 19:12 编辑 ]
作者: everest79 时间: 2009-4-27 02:09
- 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,难度大了很多。已经写出来,就贴在这里算了- @echo off&setlocal enabledelayedexpansion
- 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"
- for /f %%a in (a.txt) do (
- set str=%%a
- for %%b in (%var%) do (
- set "str=!str:%%b= %%b !"
- )
- for %%c in (!str!) do (
- if defined s (
- if !s! neq 0 (<nul set/p=!s!) else (
- if %%c neq a <nul set/p=!s!
- )
- )
- set "s=%%c"
- )
- <nul set/p=!s!&echo/&set "s="
- )
- pause
复制代码
作者: sgaizxt001 时间: 2010-6-15 05:58
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,* delims=a" %%a in (a.txt) do (
- if "%%b"=="" (set stt=%%a) else (set str=%%a & set stt=%%b)
- set str=!str:0=!
- echo.%str%a!stt!
- )
- pause
复制代码
好像测试版主给的另外一组数据也可以
没有想到顶了老帖子了,只是发现我的这个代码还是有点意思就发了。
[ 本帖最后由 sgaizxt001 于 2010-6-15 06:08 编辑 ]
作者: Hello123World 时间: 2011-7-28 14:02
- @echo off&SetLocal EnableDelayedExpansion
- (For /f "tokens=1* delims=a" %%i in (1.txt) do (Set a=%%i
- Set b=!a:0=!
- echo !b!a%%j ))>2.txt
- 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
求加分复制代码
作者: 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
出错了- @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
-
-
-
复制代码
作者: awk 时间: 2011-9-4 18:58
- 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楼也不通用- @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!
- )
- pause
复制代码
作者: yashuer 时间: 2012-7-5 17:05
本帖最后由 yashuer 于 2012-7-5 17:06 编辑
请教各位大大:
为什么用awk不能完成了?
没看到上面的gawk的代码。似乎在awk中找不到分组匹配的元字符
作者: jains521 时间: 2012-10-17 12:07
- @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
- a0000000
复制代码
作者: zh_1452 时间: 2014-10-5 20:03
- @echo off
- set str=0000acb0h
- :: 提取第一行A前的4个0
- 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前面的4个0
- 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 这个不用提取吧...
- pause
复制代码
作者: 尘丶 时间: 2015-10-2 22:58
- @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!
- )
- pause
复制代码
作者: cjiabing 时间: 2015-10-3 00:35
本帖最后由 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
- pause
复制代码
测试文本
- 0000acb0h
- 0b0c00a000s
- 0000h00ga00
- a0000000
- 0000acb0a0h
- 0ab0c00a000s
- 0000h00ga00
- 00a000a0000
复制代码
结果
- acb0h
- bca000s
- hga00
- a0000000
- acb0a0h
- ab0c00a000s
- hga00
- a000a0000
复制代码
作者: qixiaobin0715 时间: 2021-3-28 13:54
不太完善- @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!
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |