中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 怎样批量替换字符串 上一主题 | 下一主题
999888777
初级用户





积分 28
发帖 11
注册 2008-1-28
状态 离线
『楼 主』:  怎样批量替换字符串

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

[ Last edited by 999888777 on 2008-1-29 at 07:47 PM ]

2008-1-28 17:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
999888777
初级用户





积分 28
发帖 11
注册 2008-1-28
状态 离线
『第 2 楼』:  

试着弄了一个,请高手修改一下,感谢!

@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 ]

2008-1-30 11:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  

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
)    )
未测试.

2008-1-30 15:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
999888777
初级用户





积分 28
发帖 11
注册 2008-1-28
状态 离线
『第 4 楼』:  

谢谢!
测试了一下,出现很多*_已替.txt .
我的意思是在原来的文本中实现替换.
我上面弄的那个可以在原来的文本中实现替换,但替换的不对.
请高手修改一下好吗?

2008-1-30 21:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 5 楼』:  

试试这个怎么样
@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

   此帖被 +2 点积分    点击查看详情   
评分人:【 nipo 分数: +2  时间:2008-4-28 20:31




简单!简单!再简单!
2008-1-30 22:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 6 楼』:  

那你把原来文件删了,不就得了,
我的代码考虑了你原来的文件也许有用才没删.

2008-1-30 23:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
999888777
初级用户





积分 28
发帖 11
注册 2008-1-28
状态 离线
『第 7 楼』:  

谢谢大家!

2008-1-31 14:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hly
初级用户




积分 28
发帖 7
注册 2008-1-10
来自 江苏
状态 离线
『第 8 楼』:  

呵呵……学习了`~~~~




我就是我的作品
2008-2-6 17:08
查看资料  发送邮件  发短消息 网志  OICQ (254632292)  编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 9 楼』:  

哈哈,终于找到了!

谢谢terse!!!

2008-4-27 20:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 10 楼』:  

本想给terse加分,但系统提示:


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

[ 点击这里返回上一页 ]

2008-4-27 20:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 11 楼』:  

高效代码:
@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
)    )


   此帖被 +2 点积分    点击查看详情   
评分人:【 nipo 分数: +2  时间:2008-4-28 20:31




山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-27 22:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 12 楼』:  非常感谢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 ]

2008-4-28 20:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 13 楼』:  

呵呵,我的权限只够加2分。

应该给plp626加20分,先欠着吧。等权限够了还你。

2008-4-28 20:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
stockghost
中级用户





积分 215
发帖 105
注册 2007-6-2
状态 离线
『第 14 楼』:  

很少弄批处理.
如果是我来搞,就会几条简单的批命令,没办法,只能编个简单的程序来实现.
能把批处理搞成这样,着实在DOS上费了不少工夫,高,实在是高!

2008-4-28 22:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 15 楼』:  



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

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

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

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



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-28 22:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: