Board logo

标题: [文本处理] 【已解决】批处理利用for /f 进行文本中IP地址替换的原理及方法 [打印本页]

作者: sniperhgy    时间: 2009-5-9 15:45     标题: 【已解决】批处理利用for /f 进行文本中IP地址替换的原理及方法

问题是这样的,我有一个文件,内容如下:
  1. ; Kaillera server config file
  2. ; ServerName can be up to 64 characters long.
  3. ServerName=Sniperhgy's Server
  4. ; Location can be up to 64 characters long.
  5. Location=北京市网通
  6. ; URL can be up to 128 characters long. (ex: http://www.mysite.com/)
  7. URL=
  8. MaxUsers=2
  9. Port=27888
  10. ; Set Public to 0 if you want to run the server on a private LAN
  11. Public=1
  12. ; Use this parameter if you want to manually specify your server's
  13. ; IP address or leave blank for automatic
  14. ; (ex: IP=154.253.21.56)
  15. IP=221.220.117.27
  16. ; Messages flood protection
  17. ; FloodMsgNb is the max. number of times a same message has to
  18. ; be received in FloodMsgTime seconds.
  19. FloodMsgNb=5
  20. FloodMsgTime=3
  21. ; Minimum ping restriction (in ms)
  22. ; 0=disabled
  23. MinPing=0
  24. ; Maximum connection setting restriction
  25. ; 0=disabled, 1=Bad, 2=Low, 3=Average, 4=Good, 5=Excellant, 6=LAN
  26. MaxConnSet=0
  27. ; Message of the Day
  28. ; Note that you can stack "MotdLine" options
  29. ;MotdLine=Welcome to Adam's Server!
  30. ;MotdLine=Have Fun!
  31. ; AllowWebAccess (1=yes,0=no)
  32. AllowWebAccess=1
  33. ; End of Kaillera server config file
复制代码
然后我用ipconfig /all 得到本次上网的ip地址(ADSL,每次的都不一样)
我想用得到的ip地址对文件中的IP=xxx.xxx.xxx.xxx部分进行替换,想到了用For,但是原理及
方法都不知道,麻烦知道的朋友讲解一下,对了,文件中的空行不能被
削掉,麻烦各位论坛的战友了

[ 本帖最后由 sniperhgy 于 2009-5-9 22:07 编辑 ]
作者: wxcute    时间: 2009-5-9 17:01

只要换IP这一行的话,可以创建两个文件:HEAD.TXT、TIRE.TXT,
HEAD.TXT内容为IP行之上的所有文本,TIRE.TXT为IP行之下所有内容。
找出IP后,
type HEAD.TXT>IP.INI
echo ip=xxx.xxx.xxx.xxx>>IP.INI
type TIRE.TXT>>IP.INI

[ 本帖最后由 wxcute 于 2009-5-9 17:02 编辑 ]
作者: sniperhgy    时间: 2009-5-9 18:45

回2楼版主的话,首先谢谢版主的回应,但是,这样做,我也想过,不过,就失去了我发这个求助贴的意义了,想学习一下用批处理来进行文本的替换,关键还是想知道原理啊
作者: Batcher    时间: 2009-5-9 19:31     标题: 回复 3楼 的帖子

没有哪个程序可以实现直接替换的,都是通过临时文件。
作者: netbenton    时间: 2009-5-9 19:43

第一个for取得ip到变量var
第二个for遍历文本a.txt 发现为ip=的行则显示 IP=!var:~1!
findstr /n .* a.txt     加了/n参数,是在串前面加了“行号:”,防止了空行的丢失。
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%a in ('ipconfig /all') do (
  3.         if "%%a" equ "IP Address. . . . . . . . . . . ." set var=%%b
  4. )
  5. (for /f "tokens=1,* delims=:" %%a in ('findstr /n .* a.txt') do (
  6.         set str=%%b
  7.         if "!str:~1,3!" equ "IP=" (echo IP=!var:~1!!) else (echo %%b)
  8. ))>b.txt
复制代码

[ 本帖最后由 netbenton 于 2009-5-9 19:44 编辑 ]
作者: 随风    时间: 2009-5-9 20:00     标题: 回复 5楼 的帖子

echo %%b 应该改为 echo.%%b
作者: xlw542350190    时间: 2009-5-9 21:10

!str:~1,3! 这句能解释一下吗?难道!号能替代%号吗??
作者: Batcher    时间: 2009-5-9 21:19     标题: 回复 7楼 的帖子

批处理中的变量延迟扩展、变量嵌套
http://bbs.bathome.net/viewthread.php?tid=2899
作者: sniperhgy    时间: 2009-5-9 21:29

谢谢大家的回答,我去看看,理解一下的说

试了一下5楼朋友的代码,结果如下:
  1. ; Kaillera server config file
  2. ECHO 处于关闭状态。
  3. ; ServerName can be up to 64 characters long.
  4. ServerName=Sniperhgy's Server
  5. ; Location can be up to 64 characters long.
  6. Location=北京市网通
  7. ; URL can be up to 128 characters long. (ex: http://www.mysite.com/)
  8. URL=
  9. ECHO 处于关闭状态。
  10. MaxUsers=2
  11. Port=27888
  12. ECHO 处于关闭状态。
  13. ; Set Public to 0 if you want to run the server on a private LAN
  14. Public=1
  15. ECHO 处于关闭状态。
  16. ; Use this parameter if you want to manually specify your server's
  17. ; IP address or leave blank for automatic
  18. ; (ex: IP=154.253.21.56)
  19. IP=221.220.117.27
  20. ECHO 处于关闭状态。
  21. ; Messages flood protection
  22. ; FloodMsgNb is the max. number of times a same message has to
  23. ; be received in FloodMsgTime seconds.
  24. FloodMsgNb=5
  25. FloodMsgTime=3
  26. ECHO 处于关闭状态。
  27. ; Minimum ping restriction (in ms)
  28. ; 0=disabled
  29. MinPing=0
  30. ECHO 处于关闭状态。
  31. ; Maximum connection setting restriction
  32. ; 0=disabled, 1=Bad, 2=Low, 3=Average, 4=Good, 5=Excellant, 6=LAN
  33. MaxConnSet=0
  34. ECHO 处于关闭状态。
  35. ; Message of the Day
  36. ; Note that you can stack "MotdLine" options
  37. ;MotdLine=Welcome to Adam's Server
  38. ;MotdLine=Have Fun
  39. ECHO 处于关闭状态。
  40. ; AllowWebAccess (1=yes,0=no)
  41. AllowWebAccess=1
  42. ECHO 处于关闭状态。
  43. ; End of Kaillera server config file
复制代码

所有的空行,都变成了【ECHO 处于关闭状态。】
请问,这样要如何解决呢?

[ 本帖最后由 sniperhgy 于 2009-5-9 21:44 编辑 ]
作者: Batcher    时间: 2009-5-9 21:59     标题: 回复 9楼 的帖子

6楼不是给出答案了么?
作者: sniperhgy    时间: 2009-5-9 22:07

啊,原来echo.的作用是这个啊,谢谢了
作者: Batcher    时间: 2009-5-9 22:41     标题: 回复 11楼 的帖子

具体讲解请参考:
http://bbs.bathome.net/thread-939-1-1.html
作者: sniperhgy    时间: 2009-5-10 14:51

谢谢Batcher,我去学习一下
作者: Batcher    时间: 2009-5-10 15:40

终于找到问题了,是这句【if "%%a" equ "IP Adress. . . . . . . . "】,其实是因为前面还有一大堆空格,我试了一下LSS,也不行,难道只能用echo xx | find "xx"的形式吗?

可以先用set命令把空字符替换掉,然后再用if比较。
作者: sniperhgy    时间: 2009-5-10 16:03

哦,谢谢提示,我去试试看




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