中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何删除文本文件内连续多行内容?
作者:
标题: 如何删除文本文件内连续多行内容? 上一主题 | 下一主题
namelessone
新手上路





积分 7
发帖 6
注册 2009-8-20
状态 离线
『楼 主』:  如何删除文本文件内连续多行内容?

我想检索log1.txt的内容,如果发现02则删除02及之后的连续三行,试了一下for遍历,在for和if中的set命令看来无法生效,试过把变量名加上%或!,都不起作用。以下是脚本,大家帮忙看看应该怎么标记变量名。
@echo off&setlocal enabledelayedexpansion
set/a num=0
(for /f "tokens=1,* delims=:" %%a in ('findstr /n .* log1.TXT') do (   
set str=%%b
if num equ 0 (   
      if "!str:~0,2!"=="02" (set/a num=3     
                                    ) else echo/%%b        
                   )else (set/a num-=1)
) )>log2.txt
另外 这是只删一行的脚本,没有问题:
@echo off&setlocal enabledelayedexpansion
(for /f "tokens=1,* delims=:" %%a in ('findstr /n .* log1.TXT') do (   
set str=%%b  
if "!str:~0,2!"=="02" (     rem
) else echo/%%b
))>log2.TXT
log1.txt中的内容类似于:
01
02
03
04
05
06
需要格式化为:
01
06

麻烦大家给些建议 谢谢。

[ Last edited by namelessone on 2009-9-3 at 02:32 ]

2009-9-3 02:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  

把tokens=1,* 改成tokens=1,2*
找到02后返回行号,然后运算,用if过滤获取所需行号即可



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-9-3 03:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namelessone
新手上路





积分 7
发帖 6
注册 2009-8-20
状态 离线
『第 3 楼』:  

不太明白,返回行号我也需要把02这行的行号set成一个标记变量吧,然后把标记变量依次减一进行连续删除,那跟我现在的方法几乎一样啊。我就是没有试出来怎么在for+if语句里使用set/a。
或者是你说的行号方法能够不使用set,一次性直接运算删除多行?

2009-9-3 03:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by namelessone at 2009-9-3 03:43:
不太明白,返回行号我也需要把02这行的行号set成一个标记变量吧,然后把标记变量依次减一进行连续删除,那跟我现在的方法几乎一样啊。我就是没 ...

不管用什么方法,不用if和set /a是不可能的.除非是获取固定行...


按照你在一楼的思路,可以这样写:
@echo off&setlocal enabledelayedexpansion
set num=0
for /f "tokens=1,* delims=:" %%a in ('findstr /n .* log1.TXT') do (   
set str=%%b
if "!str:~0,2!"=="02" set num=1
if !num! neq 0 set /a num+=1
if "!num!" == "0" >>log2.txt echo !str!
if !num! gtr 5 >>log2.txt echo !str!
)
好象我写的有点麻烦......

[ Last edited by Hanyeguxing on 2009-9-3 at 04:50 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-9-3 04:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





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


@echo off
setlocal enabledelayedexpansion
set n=0
(for /f "tokens=1,* delims=:" %%a in ('findstr /n .* log1.txt') do (
    if !n!==0 (
        set var=%%b
        if "!var:~,2!"=="02" (set n=3) else echo;%%b
    ) else set /a n-=1
))>log2.txt


2009-9-3 04:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namelessone
新手上路





积分 7
发帖 6
注册 2009-8-20
状态 离线
『第 6 楼』:  

谢谢各位 可以用了 不过暂时还搞不清楚为什么我写的set /a num-=1无法生效

2009-9-3 06:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 7 楼』:  

if num equ 0 ( ...
作为变量,num必须用%或!括起来,不然永远num不可能等于0,也就无法执行。
set/a num=3
这里不用/a,/a表示运算,而这里显然是直接赋值的。

[ Last edited by Hanyeguxing on 2009-9-3 at 06:54 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-9-3 06:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: