标题: [文本处理] 如何利用批处理批量替换文本内不同内容的字符 [打印本页]
作者: Rasm 时间: 2012-5-2 19:44 标题: 如何利用批处理批量替换文本内不同内容的字符
本帖最后由 Rasm 于 2012-5-3 16:19 编辑
1.txt的内容如下:
b097e703c2266df140b176158db7b967
f2af3073d7fd0d1389431660a213da03
23aa1cf3836221787a710682a5d5508e
b5be656a7060dd3525027d6763c33ca0
421912aca048bceb6f78c378775205d0
7aecf141564a45c1aaa10e1309a71e6d
9aa0b8e9f776639f84f688cc4cd75ef2
0592843fee8cdfc2b03e6cd7be40126b
2.txt的内容内容如下:
a#0cc175b9c0f1b6a831c399e269772661
000#c6f057b86584942e415435ffb1fa93d4
kwq#7aecf141564a45c1aaa10e1309a71e6d
006#568628e0d993b1973adc718237da6e93
777#f1c1592588411002af340cbaedd6fc33
hdf#9aa0b8e9f776639f84f688cc4cd75ef2
w07#4521058ddf92fa5b4795d756ec73117d
结果就是想把:
把1.txt的:7aecf141564a45c1aaa10e1309a71e6d替换为:kwq#7aecf141564a45c1aaa10e1309a71e6d
把1.txt的:9aa0b8e9f776639f84f688cc4cd75ef2替换为:hdf#9aa0b8e9f776639f84f688cc4cd75ef2
作者: gawk 时间: 2012-5-2 20:58
如果2.txt的第二行是:
a123333 net123123123
这个是否需要替换?
作者: ivor 时间: 2012-5-2 21:01
本帖最后由 ivor 于 2012-5-2 21:09 编辑
你的意思是1.txt中的行内容如果和2.txt中的第二列相符,就替换?
作者: Rasm 时间: 2012-5-2 21:22
本帖最后由 Rasm 于 2012-5-2 21:27 编辑
回复 3# ivor
对,如何相符合就替换
不需要完全相符合
至少是1.txt的内容和2.txt的内容,后面的内容相符合
作者: Rasm 时间: 2012-5-2 21:24
回复 2# gawk
如果2.txt的第二行是:
a123333 net123123123
这个是否需要替换?
这种就不替换
作者: Rasm 时间: 2012-5-2 21:27
本帖最后由 Rasm 于 2012-5-2 21:32 编辑
回复 2# gawk
我的意思是说
如果文本2.txt “#”后面的内容符合1.txt那行的内容能够,那么就把1.txt那行的内容替换为2.txt那行的内容
如1.txt某一行的内容为:a1121aaaaa
2.txt某行的内容为:12388182#a1121aaaaa
那就把1.txt的“a1121aaaaa”替换为2.txt 的“12388182#a1121aaaaa”,并保存为3.txt
并且如果中间遇到不符合的就跳过或者过滤,继续下一行
作者: poter 时间: 2012-5-2 23:19
本来我以为楼主这个题很简单的,但是实际写代码却遇到很大的困难
让我再想想
作者: CrLf 时间: 2012-5-2 23:52
本帖最后由 CrLf 于 2012-5-3 17:31 编辑
实现是很容易,但是这效率...- @echo off
- for /f "delims=" %%a in (a.txt) do (
- set str=%%a
- for /f "tokens=1* delims=#" %%b in (b.txt) do (
- if %%a==%%c set str=%%b#%%c
- )
- setlocal enabledelayedexpansion
- echo;!str!
- endlocal
- )
- pause
复制代码
另,如果 a.txt 内容不长,b.txt 中的替换前长于替换后,而且要替换的内容中不含 = ! ~ * " 这几个特殊字符的话,可以试试这样:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set test=!str!
- set str=!str! "%%a"
- if !str!==!test! (
- set str=%%a
- for %%b in (!str!) do echo;%%~b
- )
- for /f "tokens=1* delims=#" %%b in (b.txt) do (
- set str=!str:%%c=%%b#%%c!
- )
- )
- for %%b in (!str!) do echo;%%~b
- pause
复制代码
作者: gawk 时间: 2012-5-3 00:58
回复 8# CrLf
看楼主的意思应该不是这个样子的
a.txt的第一行只跟b.txt的第一行(而不是全部行)比较
作者: Rasm 时间: 2012-5-3 04:59
回复 9# gawk
好吧, 我突然想到了又一种比较好的比较方法
就是1.txt的内容比2.txt里的内容多
将1.txt和2.txt里的内容相比较
如果1.txt的内容存在2.txt里那行的内容,就将1.txt里面的内容替换为空格或者删除
不知道这样可以理解的了不
作者: Rasm 时间: 2012-5-3 05:06
本帖最后由 Rasm 于 2012-5-3 05:08 编辑
回复 9# gawk
你的理解错的,不是只和第一行比较,而是2.txt里的内容和1.txt里的全部内容比较
有可能的情况是“aefafafa12312312” 在1.txt文本的 第79行
而“121212#aefafafa12312312”在2.txt文本的48行
如果是这样的情况,就将1.txt的内容替换为2.txt文本那行的内容
作者: gawk 时间: 2012-5-3 05:18
回复 11# Rasm
好吧,请解释一下5楼的说法,为什么那种情况不替换。
作者: Rasm 时间: 2012-5-3 06:45
本帖最后由 Rasm 于 2012-5-3 09:50 编辑
回复 12# gawk
因为5楼的那种是不存在的
1111#net123123123
a123333#werqerqerqrq
他们只可以唯一对应一种,
a123333#net123123123 这种是永远不可能存在的
如果遇到5楼所说的,那可以替换掉。。
作者: Rasm 时间: 2012-5-3 16:17
回复 8# CrLf
版主,你的批处理貌似不对啊
我拿个最直接,可观的例子说
1.txt的内容如下:
b097e703c2266df140b176158db7b967
f2af3073d7fd0d1389431660a213da03
23aa1cf3836221787a710682a5d5508e
b5be656a7060dd3525027d6763c33ca0
421912aca048bceb6f78c378775205d0
7aecf141564a45c1aaa10e1309a71e6d
9aa0b8e9f776639f84f688cc4cd75ef2
0592843fee8cdfc2b03e6cd7be40126b
2.txt的内容内容如下:
a#0cc175b9c0f1b6a831c399e269772661
000#c6f057b86584942e415435ffb1fa93d4
kwq#7aecf141564a45c1aaa10e1309a71e6d
006#568628e0d993b1973adc718237da6e93
777#f1c1592588411002af340cbaedd6fc33
hdf#9aa0b8e9f776639f84f688cc4cd75ef2
w07#4521058ddf92fa5b4795d756ec73117d
结果就是想把:
把1.txt的:7aecf141564a45c1aaa10e1309a71e6d替换为:kwq#7aecf141564a45c1aaa10e1309a71e6d
把1.txt的:9aa0b8e9f776639f84f688cc4cd75ef2替换为:hdf#9aa0b8e9f776639f84f688cc4cd75ef2
作者: CrLf 时间: 2012-5-3 17:28
回复 14# Rasm
已经修改...md5 验证?
作者: Rasm 时间: 2012-5-3 19:17
回复 15# CrLf
嗯,其实本意就是这样的
作者: Rasm 时间: 2012-5-3 22:21
没人会吗, 郁闷
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |