中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教:如何替换掉有特定字符串的相邻若干字符串?
« [1] [2] [3] »
作者:
标题: 请教:如何替换掉有特定字符串的相邻若干字符串? 上一主题 | 下一主题
wwwyangxm
初级用户





积分 27
发帖 27
注册 2008-11-17
状态 离线
『楼 主』:  请教:如何替换掉有特定字符串的相邻若干字符串?

现有文件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 ]

2008-11-17 10:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwwyangxm
初级用户





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

已把补充的内容加到前面了.....

[ Last edited by wwwyangxm on 2008-11-17 at 10:09 ]

2008-11-17 10:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  


@echo off
sed -i -e "s/.... .... 0 正常传输/0001 2359 0 正常传输/g" -e "s/.... .... 0 无数据传输/0001 2359 0 正常传输/g" "C:\abc.txt"
sed.exe可以去这里下载:批处理室附件收集专用帖



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





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

按照3楼的做法我做了一次啊,没通过......

2008-11-17 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwwyangxm
初级用户





积分 27
发帖 27
注册 2008-11-17
状态 离线
『第 5 楼』:  

我用手工命令去执行了下,说系统无法执行指定文件,不知道咋回事,我用的是xp系统的cmd命令

2008-11-17 10:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 6 楼』:  

用了一个很笨的方法(只适用于相同的格式):
@echo off
for /f "tokens=1-12*" %%a in ('type "c:\abc.txt"') do (
   if "%%k"=="0" (
      echo %%a %%b %%c %%d %%e %%f %%g %%h 0001 2359 0 正常传输 %%m
   ) else (echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m)
)
pause


2008-11-17 11:02
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 7 楼』:  Re 5楼

你有sed.exe么?版本如何?



2008-11-17 11:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wwwyangxm
初级用户





积分 27
发帖 27
注册 2008-11-17
状态 离线
『第 8 楼』:  

6楼的办法不错,解决了问题,能否帮我加一行,就是完成后输出到原来的那个文件?要保存修改后的abc.txt

2008-11-17 11:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwwyangxm
初级用户





积分 27
发帖 27
注册 2008-11-17
状态 离线
『第 9 楼』:  

回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):

2008-11-17 11:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by wwwyangxm at 2008-11-17 11:13 AM:
回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):

好像 c盘根目录 不在环境变量中

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





积分 27
发帖 27
注册 2008-11-17
状态 离线
『第 11 楼』:  

是的,最难的,主要是替换掉临近的几个字符串~~
特定的判断条件就是0 ,但是需要替换掉周边几个字符串,这个6楼教我如何做了~~现在只是不知道如何去把显示在屏幕上的结果保存到原来的那个文件上.....在此麻烦请教下~~~

[ Last edited by wwwyangxm on 2008-11-17 at 11:19 ]

2008-11-17 11:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 12 楼』:  Re 9楼

你的%path%变量里面有C:\么?如果没有,请把sed.exe方到C:\windows\system32



2008-11-17 11:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wwwyangxm
初级用户





积分 27
发帖 27
注册 2008-11-17
状态 离线
『第 13 楼』:  

我修改了下,另外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 ]

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

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by wwwyangxm at 2008-11-17 11:12:
6楼的办法不错,解决了问题,能否帮我加一行,就是完成后输出到原来的那个文件?要保存修改后的abc.txt


@echo off
for /f "tokens=1-12*" %%a in ('type "c:\abc.txt"') do (
   if not defined dos (
      set dos=dos
      if "%%k"=="0" (
         >"c:\abc.txt" echo %%a %%b %%c %%d %%e %%f %%g %%h 0001 2359 0 正常传输 %%m
      ) else (>"c:\abc.txt" echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m)
   ) else (
      if "%%k"=="0" (
         >>"c:\abc.txt" echo %%a %%b %%c %%d %%e %%f %%g %%h 0001 2359 0 正常传输 %%m
      ) else (>>"c:\abc.txt" echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m)
   )
)
pause


2008-11-17 11:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 15 楼』:  Re 13楼

把保存信息截图上来看看



2008-11-17 11:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: