Board logo

标题: 怎样批量替换字符串 [打印本页]

作者: 999888777     时间: 2008-1-28 17:03    标题: 怎样批量替换字符串

请热心朋友帮忙写一个批处理:
把d:\*.TXT中所有的"他"换成"她".
谢谢!

[ Last edited by 999888777 on 2008-1-29 at 07:47 PM ]
作者: 999888777     时间: 2008-1-30 11:52
试着弄了一个,请高手修改一下,感谢!

@echo off
setlocal

rem 用批处理实现文本文件中指定字符串的替换

rem DPATH   : 指定目录
rem FILETYPE: 指定文件类型
rem SCONTENT: 替换前的字符串
rem DCONTENT: 替换后的字符串
rem TMPFILE : 临时文件

set DPATH=D:\
set FILETYPE=*.txt
set SCONTENT=他
set DCONTENT=她
set TMPFILE=%random%.tmp

for /r %DPATH% %%i in (%FILETYPE%) do (
    if exist %TMPFILE% (del /f/q %TMPFILE%)
    for /f "usebackq tokens=*" %%j in ("%%i") do (
      set TMP=%%j
      echo !TMP:%SCONTENT%=%DCONTENT%!>nul 1>>%TMPFILE%
    )
    move /y %TMPFILE% "%%i"
)

endlocal
pause

[ Last edited by 999888777 on 2008-1-30 at 12:42 PM ]
作者: plp626     时间: 2008-1-30 15:05
BAT弄这个总有点缺陷(感叹号过滤):
@echo off&setlocal enabledelayedexpansion
for /r d: %%i in (*.txt) do (
     for /f "delims=" %%a in ('type "%%i"') do (
     set a=%%a
     set b=!a:他=她!
     echo.!b!>>"%%~dpni"_已替.txt
)    )
未测试.
作者: 999888777     时间: 2008-1-30 21:13
谢谢!
测试了一下,出现很多*_已替.txt .
我的意思是在原来的文本中实现替换.
我上面弄的那个可以在原来的文本中实现替换,但替换的不对.
请高手修改一下好吗?
作者: terse     时间: 2008-1-30 22:49
试试这个怎么样
@echo off
for /r %%i in (*.txt) do (
if not defined %%i set %%i=a& (
    for /f "delims=" %%a in ('findstr /n .* %%i') do (
         set list=%%a
         setlocal enabledelayedexpansion
         set list=!list:*:=!
         set list=!list:他=她!
         >>"%%i.tmp" echo/!list!
         endlocal
      )
         move /y "%%i.tmp" "%%i" 2>NUL
  )
)
pause
作者: plp626     时间: 2008-1-30 23:45
那你把原来文件删了,不就得了,
我的代码考虑了你原来的文件也许有用才没删.
作者: 999888777     时间: 2008-1-31 14:09
谢谢大家!
作者: hly     时间: 2008-2-6 17:08
呵呵……学习了`~~~~

作者: nipo     时间: 2008-4-27 20:33
哈哈,终于找到了!

谢谢terse!!!
作者: nipo     时间: 2008-4-27 20:35
本想给terse加分,但系统提示:


对不起,您最近 24 小时评分数超过 5 点 限制,请返回。

[ 点击这里返回上一页 ]
作者: plp626     时间: 2008-4-27 22:53
高效代码:
@echo off
for /r d: %%i in (*.txt) do (
     for /f "delims=" %%a in (%%~si) do (
     set a=%%a
setlocal enabledelayedexpansion
     set b=!a:他=她!
     echo.!b!>>"%%~dpni"_已替.txt
endlocal
)    )

作者: nipo     时间: 2008-4-28 20:30    标题: 非常感谢plp626!!!并请教>>>>

刚才试验了你的代码,真的非常高效,而且通用性强。

测试了一个比较复杂的文本,内容如下:

////////////////////////////////////////////////////////////////////////////////////////
"Time"        "Log Type"        "Rule Name"        "Action"        "Direction"        "Rule Type"       

"Adapter Zone"        "Data Length"        "Ethernet Source"        "Ethernet Dest"        "Ethernet Type"        "IP

Source"        "IP Dest"        "Protocol"        "Port Src"        "Port Dest"   

"2008/04/27 18:11:03"        "eLogType_Packet"        "所有其她包"        "0"        "出站"        "0"       

"FWInternetZone"        "54"        "01:2B:11:V5:M6:W5"        "03:4E:R5:J7:U7:R6"        "IP"       

"192.168.3.78"        "124.33.15.157"        "TCP"        "1039"        "80"   

"2008/04/27 18:11:03"        "eLogType_Packet"        "所有其她包"        "0"        "出站"        "0"       

"FWInternetZone"        "54"        "01:2B:11:V5:M6:W5"        "03:4E:R5:J7:U7:R6"        "IP"       

"192.168.3.78"        "124.33.15.157"        "TCP"        "1043"        "80"   

"2008/04/27 18:11:03"        "eLogType_Packet"        "所有其她包"        "0"        "出站"        "0"       

"FWInternetZone"        "54"        "01:2B:11:V5:M6:W5"        "03:4E:R5:J7:U7:R6"        "IP"       

"192.168.3.78"        "124.33.15.157"        "TCP"        "1037"        "80"   

"2008/04/27 18:11:03"        "eLogType_Packet"        "所有其她包"        "0"        "出站"        "0"       

"FWInternetZone"        "54"        "01:2B:11:V5:M6:W5"        "03:4E:R5:J7:U7:R6"        "IP"       

"192.168.3.78"        "124.33.15.157"        "TCP"        "1041"        "80"   

/////////////////////////////////////////////////////////////////////////////


测试改“她”为“他”,改“出站”为“入站”,还有数字、字母,结果都正确。而terse的代码对这个复杂文件不能实现改写。特此向你致敬、致谢!(当然也同样感谢terse,提供了够我现在用的代码,尤其是技术知识,也许是我没用好他的代码)。

测试过程中,屡次修改,中间碰到几次小问题,可能是我操作上有错误。最近一次出现这样一个错误结果:在新文本中间的空行处出现”她=他“字符串。经仔细查找,发现是源文件被改成这样。改回来之后又正常了。

不知是什么原因?我对代码含义还没弄清楚。

[ Last edited by nipo on 2008-4-28 at 09:09 PM ]
作者: nipo     时间: 2008-4-28 20:34
呵呵,我的权限只够加2分。

应该给plp626加20分,先欠着吧。等权限够了还你。
作者: stockghost     时间: 2008-4-28 22:16
很少弄批处理.
如果是我来搞,就会几条简单的批命令,没办法,只能编个简单的程序来实现.
能把批处理搞成这样,着实在DOS上费了不少工夫,高,实在是高!
作者: plp626     时间: 2008-4-28 22:26


  Quote:
Originally posted by nipo at 2008-4-28 08:30 PM:
刚才试验了你的代码,真的非常高效,而且通用性强。

测试了一个比较复杂的文本,内容如下:

/////////////////////////////////////////////////////////////// ...

我说的高效是只速度快,用for /r是用for /f速度的两倍,(这个你可以测试)
------------------------
这个帖子是比较早的了,以前没有掌握endlocal所以以为会对某些字符过滤,看到你回帖现在才补上
作者: plp626     时间: 2008-4-28 22:28


  Quote:
Originally posted by nipo at 2008-4-28 08:30 PM:
刚才试验了你的代码,真的非常高效,而且通用性强。

测试了一个比较复杂的文本,内容如下:

/////////////////////////////////////////////////////////////// ...

我说的高效是指速度快,用for /r是用for /f速度的两倍,(这个你可以测试)
------------------------
这个帖子是比较早的了,以前没有掌握endlocal所以以为会对某些字符过滤,看到你回帖现在才补上,其实你认真看我的代码有bug,会对;开头的行略去的,
我的代码和terse的代码基本上没什么区别。。。
再完善下:
@echo off
for /r d: %%i in (*.txt) do (
     for /f "eol= delims=" %%a in (%%~si) do (
     set a=%%a
setlocal enabledelayedexpansion
     set b=!a:他=她!
     echo.!b!>>"%%~dpni"_已替.txt
endlocal
)    )
但还感觉可能对某些字符失效,望高人再完善
作者: nipo     时间: 2008-4-28 23:43
多谢你了!也看了你的一些其他贴子,很敬佩。

看到你的代码后,我一直在学习是怎么个作用机制。

承蒙夸奖,其实我学批处理时间不长。以前对涉及字符的处理缺乏认识,最近才知道,以前干的都是粗活儿,字符处理在批处理中的威力很大的。
作者: jvive     时间: 2008-4-28 23:55
那里,都是学习,我只是早来你几个月,别这么客气。
不过我现在的感觉是搞字符处理还是别用cmd,你学sed,要么VBS,他们高效且通用。
作者: nipo     时间: 2008-4-29 00:05


  Quote:
Originally posted by nipo at 2008-4-28 08:30 PM:
刚才试验了你的代码,真的非常高效,而且通用性强。

测试了一个比较复杂的文本,内容如下:

/////////////////////////////////////////////////////////////// ...

测试过程中,屡次修改,中间碰到几次小问题,可能是我操作上有错误。最近一次出现这样一个错误结果:在新文本中间的空行处出现”她=他“字符串。经仔细查找,发现是源文件被改成这样。改回来之后又正常了。

---------------------------------------------------------------------------------------------------------------

这个表述有点问题:

新文本是没有空行的,源文本才有。我反复修改测试之后,竟然在新、旧文本的2段之间出现批处理中的”她=他“字符串。不知怎么搞的。
并且在测试期间,还出现过“找不到驱动器”的错误提示,而经检查,路径没有错误。

斗胆怀疑一下:有没有可能在设置延迟变量方面存在什么问题?
作者: nipo     时间: 2008-4-29 00:06
sed、VBS我也想学,真的。不过,我是实用主义者,急用先学,急用现学,我就是这样摸到批处理这条路上来的,觉得比学编程来得直接~~

[ Last edited by nipo on 2008-4-29 at 12:17 AM ]