Board logo

标题: [文本处理] [已解决]特定文件、特定行替换如何进行批处理? [打印本页]

作者: wwenyunkui    时间: 2009-8-4 14:29     标题: [已解决]特定文件、特定行替换如何进行批处理?

现有文件介绍1、系列文件1.txt~40.txt
文件1.txt内容如下
  1. <?xml version="1.0" encoding="gb2312"?>
  2. <root>
  3. <PackTypeInfo PackType="188字节"/>
  4. <IPInfo IP="192.168.0.1" IPMask="255.255.255.0" GateWay="192.168.0.1" MAC="00-00-01-01-00-04"/>
  5. <DeModule Freq="714000000" SymbolRate="6875000"/>
  6. <CodeInfo CodeAddress="224.1.0.1" CodePort="5001" AnalysisAddress="224.2.0.1" AnalysisPort="5000"/>
  7. <CheckReset Reset="1"/>
  8. </root>
复制代码
文件2.txt内容如下
  1. <?xml version="1.0" encoding="gb2312"?>
  2. <root>
  3. <PackTypeInfo PackType="188字节"/>
  4. <IPInfo IP="192.168.0.2" IPMask="255.255.255.0" GateWay="192.168.0.1" MAC="00-00-01-01-00-05"/>
  5. <DeModule Freq="714000000" SymbolRate="6875000"/>
  6. <CodeInfo CodeAddress="224.1.0.2" CodePort="5001" AnalysisAddress="224.2.0.2" AnalysisPort="5000"/>
  7. <CheckReset Reset="1"/>
  8. </root>
复制代码
以此类推

2、文件mac.txt内容:
  1. 00-01-00-00-00-01
  2. 00-01-00-00-00-02
  3. 00-01-00-00-00-03
  4. 00-01-00-00-00-04
  5. 00-01-00-00-00-05
  6. 00-01-00-00-00-06
  7. 00-01-00-00-00-07
  8. 00-01-00-00-00-08
  9. 00-01-00-00-00-09
  10. 00-01-00-00-00-0a
  11. 00-01-00-00-00-0b
  12. 00-01-00-00-00-0c
  13. 00-01-00-00-00-0d
  14. 00-01-00-00-00-0e
  15. 00-01-00-00-00-0f
  16. 00-01-00-00-00-10
  17. 00-01-00-00-00-11
  18. 00-01-00-00-00-12
  19. 00-01-00-00-00-13
  20. 00-01-00-00-00-14
  21. 00-01-00-00-00-15
  22. 00-01-00-00-00-16
  23. 00-01-00-00-00-17
  24. 00-01-00-00-00-18
  25. 00-01-00-00-00-19
  26. 00-01-00-00-00-1a
  27. 00-01-00-00-00-1b
  28. 00-01-00-00-00-1c
  29. 00-01-00-00-00-1d
  30. 00-01-00-00-00-1e
  31. 00-01-00-00-00-1f
  32. 00-01-00-00-00-20
  33. 00-01-00-00-00-21
  34. 00-01-00-00-00-22
  35. 00-01-00-00-00-23
  36. 00-01-00-00-00-24
  37. 00-01-00-00-00-25
  38. 00-01-00-00-00-26
  39. 00-01-00-00-00-27
  40. 00-01-00-00-00-28
复制代码
最终目的:
将1.txt中的MAC="00-00-01-01-00-04"中双引号内的内容替换为mac.txt的第一行
将2.txt中的MAC="00-00-01-01-00-05"中双引号内的内容替换为mac.txt的第二行
以此类推
请各位帮忙解决,谢谢
需求稍有变化,红色是变动部分

[ 本帖最后由 wwenyunkui 于 2009-8-5 11:23 编辑 ]
作者: terse    时间: 2009-8-4 16:02

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
  3. set "v=00-00-01-01-00-04"
  4.     for /f "delims=" %%a in ('dir /b /a-d *.txt^|find /v "mac.txt"') do (
  5.        set/a m+=1
  6.        for %%b in (!m!) do set t=!_%%b!
  7.       (for /f "usebackq delims=" %%i in ("%%a") do (
  8.           set "str=%%i"
  9.           for %%b in (!t!) do set str=!str:%v%=_%%b!
  10.           echo !str!
  11.           ))>~tem
  12.           move /y ~tem "%%a"
  13.     )
  14. pause
复制代码

作者: wwenyunkui    时间: 2009-8-4 16:51

原帖由 terse 于 2009-8-4 16:02 发表
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
set "v=00-00-01-01-00-04"
    for /f "delims=" %%a in ('dir /b /a-d *.txt^|find /v "mac.txt"' ...

非常感谢您的解答,目标是达到了,不过有一点遗憾:
1、在'dir /b /a-d *.txt时并不是按照数字1~40的顺序进行遍历所有txt文件的,最终结果导致1.txt文件中的“00-00-01-01-00-04”被替换为“_00-01-00-00-00-01”,而2.txt中的“00-00-01-01-00-04”被替换为“_00-01-00-00-00-0c”
2、“_00-01-00-00-00-0c”前面多了一个下划线
作者: terse    时间: 2009-8-4 17:15

原帖由 wwenyunkui 于 2009-8-4 16:51 发表

非常感谢您的解答,目标是达到了,不过有一点遗憾:
1、在'dir /b /a-d *.txt时并不是按照数字1~40的顺序进行遍历所有txt文件的,最终结果导致1.txt文件中的“00-00-01-01-00-04”被替换为“_00-01-00-00-00-01” ...

确定文件名的话 是否可以这样
_00  这里多余了_   改str=!str:%v%=_%%b! 为 str=!str:%v%=%%b!
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
  3. set "v=00-00-01-01-00-04"
  4.     for /l %%a in (1 1 40) do (
  5.       (for /f "usebackq delims=" %%i in ("%%a.txt") do (
  6.           set "str=%%i"
  7.           for %%b in (!_%%a!) do set str=!str:%v%=%%b!
  8.           echo !str!
  9.           ))>~tem
  10.           move /y ~tem "%%a.txt"
  11.     )
  12. pause
复制代码

[ 本帖最后由 terse 于 2009-8-4 17:16 编辑 ]
作者: wwenyunkui    时间: 2009-8-4 17:39

原帖由 terse 于 2009-8-4 17:15 发表

确定文件名的话 是否可以这样
_00  这里多余了_   改str=!str:%v%=_%%b! 为 str=!str:%v%=%%b!@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
set ...
不过对应关系还是不正确
作者: terse    时间: 2009-8-4 18:20

原帖由 wwenyunkui 于 2009-8-4 17:39 发表
不过对应关系还是不正确

这个应该对应的啊  
1-40.txt 就是对应 1-40行啊
作者: netbenton    时间: 2009-8-4 19:55

  1. @echo off&setlocal enabledelayedexpansion
  2. set asc=0123456789abcdef
  3. set /a n=1,m=4
  4. md temp
  5. for /f "delims=" %%a in (mac.txt) do (
  6.     set/p h2=m%%16,h1=m/16
  7.     for /f "tokens=1,2" %%1 in ("!h1! !h2!") do (set h1=!asc:~%%1,1!&set h2=!asc:~%%2,1!)
  8.     echo 处理文件!n!.txt
  9.     (for /f "delims=" %%b in (!n!.txt) do (set str=%%b
  10.         for %%k in (00-00-01-01-00-!h1!!h2!) do echo;!str:%%k=%%a!
  11.     ))>>temp\!n!.txt
  12.     set /a n+=1,m+=1
  13. )
  14. echo 更新文件存入temp目录
  15. pause
复制代码

作者: zqz0012005    时间: 2009-8-4 21:01     标题: JavaScript

注意是不可逆操作,使用前请自行备份。
  1. //&@cls&start wscript.exe -e:jscript "%~f0"&exit/b
  2. fso = new ActiveXObject('Scripting.FileSystemObject');
  3. omac = fso.OpenTextfile('mac.txt');
  4. for (i=1;i<=40;i++) {
  5.   s = fso.OpenTextfile(i+'.txt').ReadAll();
  6.   fso.OpenTextfile(i+'.txt',2).Write (
  7.     s.replace(/(MAC=")[\da-f-]{17}/gi, '$1'+omac.ReadLine()) );
  8. }
复制代码

作者: wwenyunkui    时间: 2009-8-5 08:22     标题: 回复 7楼 的帖子

感谢您的解答,不过结果和terse兄给的方法最终结果一样,不能按照既定顺序替换
即1.txt文件中的00-00-01-01-00-04被(mac.txt文件中的第一行)替换成00-01-00-00-00-01
    2.txt文件中的00-00-01-01-00-05被(mac.txt文件中的第一行)替换成00-01-00-00-00-02
作者: wwenyunkui    时间: 2009-8-5 08:23

原帖由 zqz0012005 于 2009-8-4 21:01 发表
注意是不可逆操作,使用前请自行备份。//&@cls&start wscript.exe -e:jscript "%~f0"&exit/b
fso = new ActiveXObject('Scripting.FileSystemObject');
omac = fso.OpenTextfile('mac.txt');
for (i=1;i
多谢斑竹
只是不懂javascript如何实现?菜了些,勿怪
作者: Batcher    时间: 2009-8-5 08:52     标题: 回复 10楼 的帖子

都是一些基本的操作,可以先到VBS专区找些教程看一看,就能明白代码的意思了。如果某个函数搞不懂,可以先看看帮助手册。
作者: wwenyunkui    时间: 2009-8-5 09:01

原帖由 Batcher 于 2009-8-5 08:52 发表
都是一些基本的操作,可以先到VBS专区找些教程看一看,就能明白代码的意思了。如果某个函数搞不懂,可以先看看帮助手册。
多谢管理员,呵呵
作者: terse    时间: 2009-8-5 09:42

原来的变量是固定的 修改下
发现这里一个FOR可省
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
  3.     for /l %%a in (1 1 40) do (
  4.       (for /f "usebackq tokens=*" %%i in ("%%a.txt") do (
  5.           set "str=%%i"
  6.           if "!str:~,11!"=="<IPInfo IP=" (
  7.           for /f "tokens=5,7 delims==/" %%b in ("%%i/!_%%a!") do set str=!str:%%b=%%c!
  8.           )
  9.           echo !str!
  10.           ))>~tem
  11.          move /y ~tem "%%a.txt"
  12.     )
  13. pause
复制代码

[ 本帖最后由 terse 于 2009-8-5 10:39 编辑 ]
作者: wwenyunkui    时间: 2009-8-5 11:22

原帖由 terse 于 2009-8-5 09:42 发表
原来的变量是固定的 修改下
发现这里一个FOR可省
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (mac.txt) do set /a n+=1&set _!n!=%%i
    for /l %%a in (1 1 40) do (
      (for /f ...
非常感谢,对应关系正确了,呵呵,只是对于set还是不怎么熟悉,自己慢慢学吧。
作者: Batcher    时间: 2009-8-5 13:44     标题: 回复 14楼 的帖子

可以先看看set命令的帮助文档中关于字符串替换的讲解:
Environment variable substitution has been enhanced as follows:

    %PATH:str1=str2%

would expand the PATH environment variable, substituting each occurrence
of "str1" in the expanded result with "str2".  "str2" can be the empty
string to effectively delete all occurrences of "str1" from the expanded
output.  "str1" can begin with an asterisk, in which case it will match
everything from the beginning of the expanded output to the first

作者: nopr    时间: 2009-8-5 14:24

这是什么意思啊?
"<IPInfo IP="
作者: wwenyunkui    时间: 2009-8-7 11:47

原帖由 nopr 于 2009-8-5 14:24 发表
这是什么意思啊?
"<IPInfo IP="
这个没有特别的意思,只是目标文件中的一句话。




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