中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-10 13:03
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 请教:如何替换掉有特定字符串的相邻若干字符串? 查看 2,426 回复 40
楼 主 请教:如何替换掉有特定字符串的相邻若干字符串? 发表于 2008-11-17 10:04 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
现有文件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 发表于 2008-11-17 10:08 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
已把补充的内容加到前面了.....

[ Last edited by wwwyangxm on 2008-11-17 at 10:09 ]
3 发表于 2008-11-17 10:28 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@echo off
sed -i -e "s/.... .... 0 正常传输/0001 2359 0 正常传输/g" -e "s/.... .... 0 无数据传输/0001 2359 0 正常传输/g" "C:\abc.txt"

sed.exe可以去这里下载:批处理室附件收集专用帖
4 发表于 2008-11-17 10:48 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
按照3楼的做法我做了一次啊,没通过......
5 发表于 2008-11-17 10:53 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
我用手工命令去执行了下,说系统无法执行指定文件,不知道咋回事,我用的是xp系统的cmd命令
6 发表于 2008-11-17 11:02 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
用了一个很笨的方法(只适用于相同的格式):
@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
7 Re 5楼 发表于 2008-11-17 11:10 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
你有sed.exe么?版本如何?
8 发表于 2008-11-17 11:12 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
6楼的办法不错,解决了问题,能否帮我加一行,就是完成后输出到原来的那个文件?要保存修改后的abc.txt
9 发表于 2008-11-17 11:13 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):
10 发表于 2008-11-17 11:17 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
Originally posted by wwwyangxm at 2008-11-17 11:13 AM:
回7楼:sed.exe我从你给我的连接那下载过来的,放到c盘根目录了

sed.exe(4.1.4):

好像 c盘根目录 不在环境变量中
11 发表于 2008-11-17 11:18 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
是的,最难的,主要是替换掉临近的几个字符串~~
特定的判断条件就是0 ,但是需要替换掉周边几个字符串,这个6楼教我如何做了~~现在只是不知道如何去把显示在屏幕上的结果保存到原来的那个文件上.....在此麻烦请教下~~~

[ Last edited by wwwyangxm on 2008-11-17 at 11:19 ]
12 Re 9楼 发表于 2008-11-17 11:18 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
你的%path%变量里面有C:\么?如果没有,请把sed.exe方到C:\windows\system32
13 发表于 2008-11-17 11:22 ·  中国 湖北 黄石 电信
初级用户
积分 27
发帖 27
注册 2008-11-17 09:28
17年会员
UID 131211
性别 男
状态 离线
我修改了下,另外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 发表于 2008-11-17 11:25 ·  中国 广西 百色 中移铁通
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
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
15 Re 13楼 发表于 2008-11-17 11:25 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
把保存信息截图上来看看
论坛跳转: