标题: 怎样批量替换字符串
[打印本页]
作者: 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 ]