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

[文本处理] 如何利用批处理批量替换文本内不同内容的字符

本帖最后由 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

如果2.txt的第二行是:
a123333         net123123123
这个是否需要替换?

TOP

本帖最后由 ivor 于 2012-5-2 21:09 编辑

你的意思是1.txt中的行内容如果和2.txt中的第二列相符,就替换?
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

本帖最后由 Rasm 于 2012-5-2 21:27 编辑

回复 3# ivor


    对,如何相符合就替换

不需要完全相符合

至少是1.txt的内容和2.txt的内容,后面的内容相符合

TOP

回复 2# gawk


    如果2.txt的第二行是:
a123333         net123123123
这个是否需要替换?

这种就不替换

TOP

本帖最后由 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

并且如果中间遇到不符合的就跳过或者过滤,继续下一行

TOP

本来我以为楼主这个题很简单的,但是实际写代码却遇到很大的困难

让我再想想

TOP

本帖最后由 CrLf 于 2012-5-3 17:31 编辑

实现是很容易,但是这效率...
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    set str=%%a
  4.    for /f "tokens=1* delims=#" %%b in (b.txt) do (
  5.       if %%a==%%c set str=%%b#%%c
  6.    )
  7.    setlocal enabledelayedexpansion
  8.    echo;!str!
  9.    endlocal
  10. )
  11. pause
复制代码
另,如果 a.txt 内容不长,b.txt 中的替换前长于替换后,而且要替换的内容中不含 = ! ~ * " 这几个特殊字符的话,可以试试这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do (
  3.    set test=!str!
  4.    set str=!str! "%%a"
  5.    if !str!==!test! (
  6.       set str=%%a
  7.       for %%b in (!str!) do echo;%%~b
  8.    )
  9.    for /f "tokens=1* delims=#" %%b in (b.txt) do (
  10.       set str=!str:%%c=%%b#%%c!
  11.    )
  12. )
  13. for %%b in (!str!) do echo;%%~b
  14. pause
复制代码
1

评分人数

    • Rasm: 继续努力技术 + 1

TOP

回复 8# CrLf


看楼主的意思应该不是这个样子的
a.txt的第一行只跟b.txt的第一行(而不是全部行)比较

TOP

回复 9# gawk


    好吧, 我突然想到了又一种比较好的比较方法

就是1.txt的内容比2.txt里的内容多

将1.txt和2.txt里的内容相比较

如果1.txt的内容存在2.txt里那行的内容,就将1.txt里面的内容替换为空格或者删除

不知道这样可以理解的了不

TOP

本帖最后由 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文本那行的内容

TOP

回复 11# Rasm


    好吧,请解释一下5楼的说法,为什么那种情况不替换。

TOP

本帖最后由 Rasm 于 2012-5-3 09:50 编辑

回复 12# gawk


    因为5楼的那种是不存在的

1111#net123123123
a123333#werqerqerqrq

他们只可以唯一对应一种,

a123333#net123123123    这种是永远不可能存在的

如果遇到5楼所说的,那可以替换掉。。

TOP

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

TOP

回复 14# Rasm


    已经修改...md5 验证?

TOP

返回列表