Board logo

标题: [文本处理] 批处理怎样实现多字符串的按TXT行数的规则替换? [打印本页]

作者: w1983912    时间: 2011-5-21 23:59     标题: 批处理怎样实现多字符串的按TXT行数的规则替换?

X文本 有字符串:A101 - A200  如何把所有 A101 - A200 替换成 对应TXT文本   101行  到200行的数据呢?

以下演示一下: 把所有的A101-A110 变成A.txt文本第101-110行的数据  应该算是多字符串的替换
X.txt内容是:
T I `e_a` S('5','0','0','5','e','{c}/e','1','A101','1','1','-1','0','0','{K}','/e/{py}.html','{L}','','','','0','{c}/e','','0','A102','0','','','');
T I `e_a` S('6','0','0','6','A110','{c}/A101','1','index.html','1','1','-1','0','0','{K}','/f/{py}.html','{L}','','','','0','{c}/f','','A105','0','0','','','');
T I `e_a` S('7','0','0','7','A106','{c}/g','1','index.html','1','1','-1','0','A110','{K}','/g/{py}.html','{L}','','','','A103','{c}/g','','A108','0','0','','','');
T I `e_a` S('8','0','0','A107','h','{c}/h','1','index.html','1','A109','-1','0','0','{K}','/h/{py}.html','{L}','','','','0','{c}/h','','A104','0','0','','','');

A.txt  101-110行的内容是:
游戏
音 乐
电影
唱歌
跳舞
赛 车
汽车
酒 吧
娱乐
比 赛

得到新的bbb.txt:    所有的"A101" 变成 "游戏"  其他的都不变化

T I `e_a` S('5','0','0','5','e','{c}/e','1','游戏','1','1','-1','0','0','{K}','/e/{py}.html','{L}','','','','0','{c}/e','','0','音 乐','0','','','');
T I `e_a` S('6','0','0','6','比 赛','{c}/游戏','1','index.html','1','1','-1','0','0','{K}','/f/{py}.html','{L}','','','','0','{c}/f','','跳舞','0','0','','','');
T I `e_a` S('7','0','0','7','赛 车','{c}/g','1','index.html','1','1','-1','0','比 赛','{K}','/g/{py}.html','{L}','','','','电影','{c}/g','','酒 吧','0','0','','','');
T I `e_a` S('8','0','0','汽车','h','{c}/h','1','index.html','1','娱乐','-1','0','0','{K}','/h/{py}.html','{L}','','','','0','{c}/h','','唱歌','0','0','','','');

刚刚是10个字符串的文本替换 供演示用   现在我需要替换的那个文本是 100个变量   
100个变量  A101--A200      换成第101行--第200行对应的数据
如果更多的变量  能否设定一个范围呢? 比如A101--A400      换成第101行--第400行对应的数据

希望大家帮帮忙 谢谢了

以下  附上一个 单字符串的替换 想要的功能  改来改去还是不行。。。。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f %%a in (a.txt) do (
  3.     for /f "delims=" %%b in (1.txt) do set "str=%%b"&echo !str:胃癌=%%a!
  4.    ))>>111.txt
复制代码

作者: techon    时间: 2011-5-22 00:28

!str:胃癌=%%a!
变量替换用反了
如替换字符串str 中的 A101 为 %%A
set str=!str:A101=%%A!


用批处理做比较复杂的字符串替换还是有点麻烦的 不如用word 的替换功能方便 如果你会用word的宏 就更方便了
作者: w1983912    时间: 2011-5-22 00:29

本帖最后由 w1983912 于 2011-5-22 00:45 编辑

谢谢楼上朋友   代码改后没有变化  并不能把字符串用其他TXT的指定行的数据覆盖

我要的是多个字符串替换并且是用TXT的指定行覆盖   不是单行的全部覆盖。。。。。。。。。。

如果可以单字符串(所有相同的) 用指定txt的指定行数据覆盖也可以啊  , 100个替换就用100个命令就可以了

深夜继续求助
作者: batman    时间: 2011-5-22 00:54

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%a in ('findstr /n .* a.txt') do set "_%%a=%%b"
  3. (for /f "tokens=1* delims=A" %%a in (x.txt) do (
  4.     set "str=%%b"&set "a=!str:~,3!"
  5.     for %%c in (!a!) do echo %%a!_%%c!!str:~3!
  6. ))>bbb.txt
  7. start bbb.txt
复制代码

作者: techon    时间: 2011-5-22 00:56

。。。主要你这不是一一对应的关系 每行里不一定有几个要替换的 比如第一行
T I `e_a` S('5','0','0','5','e','{c}/e','1','A101','1','1','-1','0','0','{K}','/e/{py}.html','{L}','','','','0','{c}/e','','0','A102','0','','','');
有A101 又有A102 。。。处理起来稍微麻烦点 ,要是不讲究效率的话就给你看看
作者: batman    时间: 2011-5-22 01:19

本帖最后由 batman 于 2011-5-22 01:24 编辑

开始看错题意,下面代码只考虑了一行最多要替换4个的情况,如不够请自行修改:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%a in ('findstr /n .* a.txt') do set "_%%a=%%b"
  3. (for /f "tokens=1-5 delims=A" %%a in (x.txt) do (
  4.     set "var="
  5.     call :lp "%%b" "%%c" "%%d" "%%e"
  6.     echo %%a!var!
  7. ))>bbb.txt
  8. start bbb.txt&goto :eof
  9. :lp
  10. set "str=%~1"&set "a=!str:~,3!"
  11. for %%a in (!a!) do set "var=!var!!_%%a!!str:~3!"
  12. if "%~2" neq "" shift&goto lp
复制代码

作者: w1983912    时间: 2011-5-22 01:40

谢谢 实现了

一行换4个以上重复的  倒 请问 不够的话 修改哪呢??
作者: batman    时间: 2011-5-22 01:43

7# w1983912
1 tokens=1-5
2 call :lp "%%b" "%%c" "%%d" "%%e"
作者: batman    时间: 2011-5-22 02:19

本帖最后由 batman 于 2011-5-22 02:39 编辑

vbs版(好麻烦):
  1. Dim a(10000)
  2. Set fso = CreateObject("scripting.filesystemobject")
  3. fso.OpenTextFile("a.txt", 8, 1).WriteLine vbcrlr & "end"
  4. Set otext = fso.OpenTextFile("a.txt", 1, 1)
  5. Do Until a(i) = "end"
  6.   i = i + 1
  7.   a(i) = otext.ReadLine()
  8. Loop
  9. otext.Close
  10. Set otext = fso.OpenTextFile("x.txt", 1, 1)
  11. vbstr = otext.ReadAll()
  12. For i = 0 To UBound(Split(vbstr, "A"))
  13.   If InStr("123456789", Left(Split(vbstr, "A")(i), 1)) Then
  14.     vbvar = vbvar & a(Left(Split(vbstr, "A")(i), 3)) & Right(Split(vbstr, "A")(i), Len(Split(vbstr, "A")(i))-3)
  15.   Else
  16.     vbvar = vbvar & Split(vbstr, "A")(i)
  17.   End If
  18. Next
  19. otext.Close
  20. fso.OpenTextFile("bbb.txt", 2 ,1).Write vbvar
  21. Set fso = Nothing
复制代码

作者: w1983912    时间: 2011-5-22 03:01

谢谢  可以了
刚刚我自己也用php代码也实现了。。。多文本中的多字符串 用指定的多txt的指定行 替换 显示并写入




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