中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-02 15:36
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 再问个问题,能否实现文本内容按标签替换? 查看 889 回复 6
楼 主 再问个问题,能否实现文本内容按标签替换? 发表于 2006-12-12 08:56 ·  中国 浙江 杭州 电信
中级用户
★★
积分 305
发帖 85
注册 2005-05-23 00:00
21年会员
UID 39004
性别 男
状态 离线
嘿嘿,我问题好像有点多哦。
我想实现按标签替换,不知道能不能实现。
a.bat
:123
1a
bg
4asf
asdf
234
asdftewt
ahrey
:asdk
skajdfksa

b.txt
1a
2b
3c
4d
5e
用b.txt的内容只替换a.bat中标签123的内容,而标签asdk的内容则不变
2 发表于 2006-12-12 09:29 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  仅仅针对你的这个示例,写了段代码,如果有更复杂的需求,请自行改动:

@echo off
set flag=
echo :123>test.txt
more b.bat>>test.txt
setlocal enabledelayedexpansion
for /f "skip=1" %%i in (a.bat) do (
set var=%%i
if "!var:~0,1!"==":" set flag=1
if !flag! equ 1 echo %%i>>test.txt
)
start test.txt
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
3 发表于 2006-12-12 09:44 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
gsed 下载: http://www.vkill.net/tools.html




@echo off
cd.>>b.txt
>test.txt echo /^:123$/,/^:asdk$/c\
>>test.txt echo :123\
>>test.txt echo :asdk
gsed -f test.txt a.txt|gsed "/:123/r\b.txt"|more>test.txt
type test.txt
pause



[ Last edited by vkill on 2006-12-13 at 05:08 AM ]
4 发表于 2006-12-12 09:45 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
namejm 兄,貌似不行,我试了只出现:123
5 发表于 2006-12-12 09:56 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  没测试过的代码我轻易不会发出来的,除非是特别简单的代码。另外,我把楼主的b.txt文件名写成了b.bat,可能是这个原因造成了你测试的失败。疏忽之处,无伤大雅,就懒得改了^_^
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
6 发表于 2006-12-12 10:24 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
@echo off
setlocal enabledelayedexpansion

rem 下面三个文件名自行更改,若路径包含空格注意加引号
set file=a.bat
set nextFile=b.txt
set newFile=c.txt

set num=
set strRows=

rem 指定过滤标号
set "strBegan=:123"
set "strEnd=:asdk"

rem 获得过滤标号行号
for /f "delims=:" %%i in ('findstr /nr "^:" %file%') do set "strRows=!strRows! %%i"

rem 读源文件1到变量
for /f "delims=" %%i in ('findstr .* %file%') do (
set /a num += 1
set "!num!=%%i"
)

rem 对比内容获得需要过滤的开始结束指针
for %%i in (%strRows%) do (
if "!%%i!" == "!strBegan!" set began=%%i
if "!%%i!" == "!strEnd!" set end=%%i
)

rem 下面把3部分打印到新文件中
set /a end -= 1
for /l %%i in (1,1,%began%) do echo,!%%i!>%newFile%
type %nextFile% >>%newFile%
more +%end% %file% >>%newFile%

exit /b 0

稍做修改就可以实现比较通用的效果,不过若是涉及到复杂的文本操作的话还是建议用vbs或者其他第三方工具/。
7 发表于 2006-12-13 11:39 ·  中国 山西 太原 电信
初级用户
积分 56
发帖 22
注册 2006-12-13 10:54
19年会员
UID 73399
性别 男
状态 离线
请问下setlocal enabledelayedexpansion有什么居体的含义吗,请详解下
我只知道用他可以实现用!替换%
启动或停用延缓环境变量扩展名听不懂,请通俗的解释一下!
论坛跳转: