中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-10 13:04
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » 请教:如何替换掉有特定字符串的相邻若干字符串?
可打印版本  2,427 / 40
第1楼 wwwyangxm 发表于 2008-11-17 10:04
初级用户 发帖 27 积分 27
请教:如何替换掉有特定字符串的相邻若干字符串?
现有文件c:\abc.txt文件一个,内容如下
自动传输处理文件系统 abbd
中文 SN##10.ABJ SN10.ABJ copy_get Z: pub3 dmsg r:\cl23s 0010 0510 1 正常传输(11/17/108_0:30)
中文 SN##20.ABJ SN20.ABJ copy_get Z: pub3 dmsg r:\cl23s 0020 0520 0 正常传输(11/17/108_0:40)
中文 SN##30.ABJ SN30.ABJ copy_get Z: pub3 dmsg r:\cl23s 0030 0530 0 正常传输(11/17/108_0:50)
中文 SN##40.ABJ SN40.ABJ copy_get Z: pub3 dmsg r:\cl23s 0040 0540 0 无数据传输
中文 SN##50.ABJ SN50.ABJ copy_get Z: pub3 dmsg r:\cl23s 0050 0550 0 无数据传输

现在我需要的是当出现 “???? ???? 0 正常传输” 或者“???? ???? 0 无数据传输”时,能否把它替换成
“0001 2359 0 正常传输”?

注:文中????为变量数字字符串

参考过对单独的字符串进行替换的办法,但是涉及到几个空格的字符串还得加上临近字符串的替换,就不会处理了,麻烦高手指导下:)

不要试图用字符位置去进行特定字符位替换,在前面的第二个字符,例如:SN##20.ABJ 不是一个固定长度的字符串~~


下面是一个对单独的字符串进行替换的例子,已测试可用。



@echo off
::把需要搜索的路径赋值给变量sp,这里举例是c:\tmp
set sp=c:\tmp
::把需要查找的文件名赋值给变量cf,这里举例是root.txt
set cf=root.txt
::把将被替换的字符串赋值给st,这里举例是apple
set st=apple
::把替换字符串赋值给dt,这里举例是lemon
set dt=lemon

::以上的这些赋值执行后,将会把C盘tmp文件夹下面包括子文件夹里的root.txt中的apple全部替换成lemon

::下面的代码将完成替换工作

for /r %sp% %%a in (%cf%) do (call :doit "%%~dpa")
goto end

:doit
setlocal enabledelayedexpansion
pushd %1
for /f "tokens=1,2* delims=:" %%i in ('findstr /n ".*" %cf%') do (
set txt=%%j
if "!txt!" == "" (
echo.>>%1root.tmp
) else (
echo !txt:%st%=%dt%!>>%1root.tmp
)
)
move /y root.tmp root.txt

:end

[ Last edited by wwwyangxm on 2008-11-17 at 10:09 ]
第2楼 wwwyangxm 发表于 2008-11-17 10:08
初级用户 发帖 27 积分 27
已把补充的内容加到前面了.....

[ Last edited by wwwyangxm on 2008-11-17 at 10:09 ]
第3楼 HAT 发表于 2008-11-17 10:28
版主 发帖 5,017 积分 9,023

sed.exe可以去这里下载:批处理室附件收集专用帖
第4楼 wwwyangxm 发表于 2008-11-17 10:48
初级用户 发帖 27 积分 27
按照3楼的做法我做了一次啊,没通过......
第5楼 wwwyangxm 发表于 2008-11-17 10:53
初级用户 发帖 27 积分 27
我用手工命令去执行了下,说系统无法执行指定文件,不知道咋回事,我用的是xp系统的cmd命令
第6楼 moniuming 发表于 2008-11-17 11:02
银牌会员 发帖 574 积分 1,335 来自 广西
用了一个很笨的方法(只适用于相同的格式):
第7楼 HAT 发表于 2008-11-17 11:10
版主 发帖 5,017 积分 9,023
Re 5楼
你有sed.exe么?版本如何?
第8楼 wwwyangxm 发表于 2008-11-17 11:12
初级用户 发帖 27 积分 27
6楼的办法不错,解决了问题,能否帮我加一行,就是完成后输出到原来的那个文件?要保存修改后的abc.txt
第9楼 wwwyangxm 发表于 2008-11-17 11:13
初级用户 发帖 27 积分 27
回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):
第10楼 tireless 发表于 2008-11-17 11:17
银牌会员 发帖 1,122 积分 2,025
Originally posted by wwwyangxm at 2008-11-17 11:13 AM:
回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):

好像 c盘根目录 不在环境变量中
第11楼 wwwyangxm 发表于 2008-11-17 11:18
初级用户 发帖 27 积分 27
是的,最难的,主要是替换掉临近的几个字符串~~
特定的判断条件就是0 ,但是需要替换掉周边几个字符串,这个6楼教我如何做了~~现在只是不知道如何去把显示在屏幕上的结果保存到原来的那个文件上.....在此麻烦请教下~~~

[ Last edited by wwwyangxm on 2008-11-17 at 11:19 ]
第12楼 HAT 发表于 2008-11-17 11:18
版主 发帖 5,017 积分 9,023
Re 9楼
你的%path%变量里面有C:\么?如果没有,请把sed.exe方到C:\windows\system32
第13楼 wwwyangxm 发表于 2008-11-17 11:22
初级用户 发帖 27 积分 27
我修改了下,另外sed放c盘根目录,还是不行哦....


@echo off
c:\sed.exe -i -e "s/.... .... 0 正常传输/0001 2359 0 正常传输/g" -e "s/.... .... 0 无数据传输/0001 2359 0 正常传输/g" "C:\abc.txt"

变量中没有c:\ 之类的,只是数字变量

[ Last edited by wwwyangxm on 2008-11-17 at 11:23 ]
第14楼 moniuming 发表于 2008-11-17 11:25
银牌会员 发帖 574 积分 1,335 来自 广西
Originally posted by wwwyangxm at 2008-11-17 11:12:
6楼的办法不错,解决了问题,能否帮我加一行,就是完成后输出到原来的那个文件?要保存修改后的abc.txt

第15楼 HAT 发表于 2008-11-17 11:25
版主 发帖 5,017 积分 9,023
Re 13楼
把保存信息截图上来看看
1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023