[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]特定文件、特定行替换如何进行批处理?

现有文件介绍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 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

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

TOP

原帖由 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”前面多了一个下划线

TOP

原帖由 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 编辑 ]

TOP

原帖由 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 ...
不过对应关系还是不正确

TOP

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

这个应该对应的啊  
1-40.txt 就是对应 1-40行啊

TOP

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

TOP

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. }
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 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

TOP

原帖由 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如何实现?菜了些,勿怪

TOP

回复 10楼 的帖子

都是一些基本的操作,可以先到VBS专区找些教程看一看,就能明白代码的意思了。如果某个函数搞不懂,可以先看看帮助手册。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

原来的变量是固定的 修改下
发现这里一个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 编辑 ]
1

评分人数

TOP

原帖由 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还是不怎么熟悉,自己慢慢学吧。

TOP

回复 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
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表