Board logo

标题: [代码合集] 批处理如何进行文本内字符串替换? [打印本页]

作者: 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

文本内容不能含有半角 ! 号
:
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('findstr /n .* a.txt') do (
  3.     set str=%%a
  4.     set str=!str:*:=!
  5.     if not defined str (echo;) else (
  6.         if /i "!str:~0,9!"=="allcount=" (set num=allcount) else (
  7.             if defined num echo !num!=!str:~8!&set "num="
  8.             echo !str!
  9.         )
  10.     )
  11. )
  12. pause
复制代码

作者: hfg1977    时间: 2010-9-9 16:28

findstr 速度不快
  1. for /f "tokens=1* delims=:" %%a in ('findstr /n ".*" "1.txt"') do (
  2. echo.%%b|findstr /i "okcount"&&for /f "tokens=2 delims==" %%i in ("%%b") do (echo ALLCount=%%i>>dest.txt)
  3. echo.%%b|findstr /i "ALLCount">nul||echo.%%b>>dest.txt
  4. )
复制代码

作者: asnahu    时间: 2010-9-9 16:51

  1. @echo off
  2. sed "/ALLCount/{N; s/\([a-zA-Z]*=\)\([0-9]*\)\n\([a-zA-Z]*=\)\([0-9]*\)/\1\4\n\3\4/}" urfile
  3. 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