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