中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 再问个问题,能否实现文本内容按标签替换?
作者:
标题: 再问个问题,能否实现文本内容按标签替换? 上一主题 | 下一主题
yardian
中级用户




积分 305
发帖 85
注册 2005-5-23
状态 离线
『楼 主』:  再问个问题,能否实现文本内容按标签替换?

嘿嘿,我问题好像有点多哦。
我想实现按标签替换,不知道能不能实现。
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的内容则不变

2006-12-12 08:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  仅仅针对你的这个示例,写了段代码,如果有更复杂的需求,请自行改动:
@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没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-12 09:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 3 楼』:  

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 ]

2006-12-12 09:44
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 4 楼』:  

namejm 兄,貌似不行,我试了只出现:123

2006-12-12 09:45
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 5 楼』:  

  没测试过的代码我轻易不会发出来的,除非是特别简单的代码。另外,我把楼主的b.txt文件名写成了b.bat,可能是这个原因造成了你测试的失败。疏忽之处,无伤大雅,就懒得改了^_^



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-12-12 09:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 6 楼』:  


@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或者其他第三方工具/。

2006-12-12 10:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fbwolf
初级用户





积分 56
发帖 22
注册 2006-12-13
状态 离线
『第 7 楼』:  

请问下setlocal enabledelayedexpansion有什么居体的含义吗,请详解下
我只知道用他可以实现用!替换%
启动或停用延缓环境变量扩展名听不懂,请通俗的解释一下!

2006-12-13 11:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: