标题: [代码合集] 批处理如何进行文本内字符串替换? [打印本页]
作者: edmond 时间: 2010-9-9 15:00 标题: 批处理如何进行文本内字符串替换?
文本如下
F;///////////////////////////////////////////////
; Factory Code / Process Code
[NAME]
ALLCount=5
okcount=3
Site=NAMS
Line=B1
;///////////////////////////////////////////////
; AD Boad Debug Data
;
[ADIO]
DEBUG=0
DRIVE=c:
ALLCount=45
okcount=33
adgoldll
coelld
cjdovsa';l
end
我想把所有 allcount=后面的数字 全部用紧跟在后面的okcount=的数字 替换,其他保持不变,不能丢失空行!其实整个文本里很多allcount,
并且allcount和okcount一定是同时出现的
请高手帮帮忙!拜托了!
作者: 随风 时间: 2010-9-9 16:25
文本内容不能含有半角 ! 号
:- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('findstr /n .* a.txt') do (
- set str=%%a
- set str=!str:*:=!
- if not defined str (echo;) else (
- if /i "!str:~0,9!"=="allcount=" (set num=allcount) else (
- if defined num echo !num!=!str:~8!&set "num="
- echo !str!
- )
- )
- )
- pause
复制代码
作者: hfg1977 时间: 2010-9-9 16:28
findstr 速度不快- for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" "1.txt"') do (
- echo.%%b|findstr /i "okcount"&&for /f "tokens=2 delims==" %%i in ("%%b") do (echo ALLCount=%%i>>dest.txt)
- echo.%%b|findstr /i "ALLCount">nul||echo.%%b>>dest.txt
- )
复制代码
作者: asnahu 时间: 2010-9-9 16:51
- @echo off
- sed "/ALLCount/{N; s/\([a-zA-Z]*=\)\([0-9]*\)\n\([a-zA-Z]*=\)\([0-9]*\)/\1\4\n\3\4/}" urfile
- exit
复制代码
作者: edmond 时间: 2010-9-9 17:05
4楼代码什么意思完全不明白阿?
随风超版的代码把我的;//////////////// 这样的符号都丢了
@echo off
setlocal enabledelayedexpansion
set m=1
for /f "tokens=1,2 delims==" %%i in (11.txt) do (
if %%i==OKCount (set k!m!=%%j&set /a m+=1))
set n=1
for /f "usebackq delims=:" %%a in (`findstr /n "^$" 11.txt`) do (
set t!n!=%%a&set /a n+=1)
set p=0
set s=1
set r=1
for /f "eol=* tokens=1,2 delims=~" %%a in (11.txt) do (set /a p+=1&set x=%%a&set /a l=t!r!
if !p!==!l! (echo.>>tem.txt&echo %%a>>tem.txt&set /a r+=1&set /a p+=1
) else if "!x:~0,8!"=="AllCount" (set /a c=k!s!&echo AllCount=!c!>>tem.txt&set /a s+=1
) else (echo %%a>>tem.txt )
)
pause
我自己写的,但是连续两个空行的时候就出错了!
4楼的太深奥了,完全不明白
作者: 随风 时间: 2010-9-9 17:11 标题: 回复 5楼 的帖子
按你顶楼给的样本文件,我这里测试没问题啊
到底是什么情况下丢失能说清楚点吗?
作者: edmond 时间: 2010-9-9 17:16
我的原文本附件上传了,我的目的是用allcount=后面的数字用紧跟着的okcount=后面的数字代替,生成新的文本,其他的全部都不能变,包括;////// 空行等等,请指教!
其他的变了,我怕设备程序出错!
作者: 随风 时间: 2010-9-9 17:24
仍然没有发现什么问题。
楼主认真测试了吗?
作者: edmond 时间: 2010-9-9 17:27
3楼的 谢谢了,你的代码好用,就是慢了点,还是谢谢你!
还有弱弱的问一下,"^" 与 ".*"效果是不是一样的阿?
作者: 随风 时间: 2010-9-9 17:37
我很无语。。。。。。。。。。。
作者: hfg1977 时间: 2010-9-9 17:38
随风 版主的代码没有问题的,速度有够快, 我用findstr慢死了.
因为for不能处理空行, findstr /n ".*" 为空行加行号.
"^$" 对于findstr 并不能表示空行.
作者: cjiabing 时间: 2010-9-9 17:39
原帖由 随风 于 2010-9-9 17:37 发表
我很无语。。。。。。。。。。。
哈哈,不要和学生一般见识!~
看看我那个问题吧,做点有意义的事情!~
作者: edmond 时间: 2010-9-9 17:54
确认完毕, 随风超版的代码正确,效率也好,谢谢赐教!
另外有个小问题点想请教一下
!str:*:=! 中 * 是什么意思?
作者: edmond 时间: 2010-9-9 19:40
已经研究明白了,学习了很多!
真是万事开头难啊
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |