中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何简写输出指定多行文本的批处理
<<   [1] [2]  >>   >
作者:
标题: [已结]如何简写输出指定多行文本的批处理 上一主题 | 下一主题
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『楼 主』:  [已结]如何简写输出指定多行文本的批处理

我想指定输出一个文本的第1、13、14、15、16、17、18、19、20、21、22行,如下批处理可以实现,但是代码复杂,请问如何简写!谢谢! for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "1"=="%%i" echo %%j>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "13"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "14"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "15"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "16"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "17"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "18"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "19"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "20"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "21"=="%%i" echo %%j>>2.txt ) for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do ( if "22"=="%%i" echo %%j>>2.txt ) [ Last edited by hbby on 2007-9-15 at 09:23 PM ]


2007-9-13 17:30
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 2 楼』:  

sed q AUTOEXEC.BAK>2.txt sed -n "13,22p" AUTOEXEC.BAK>>2.txt




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-9-13 17:43
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 3 楼』:  

老大,不想用SED有办法吗?谢谢


2007-9-13 17:46
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 4 楼』:  

这样呢?
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do (
        if "%%i" equ "1" echo %%j>2.txt
        if "%%i" geq "13" if "%%i" leq "22" echo %%j>>2.txt
)




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-9-13 17:55
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 5 楼』:  

对了,老大,我的原文件是 @ECHO OFF GOTO %CONFIG% :RECOVER PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND SET TEMP=C:\DOSTOOLS\TEMP LH DOSTOOLS\COMMAND\DOSKEY LH DOSTOOLS\COMMAND\MOUSE LH DOSTOOLS\SMARTDRV.EXE C:\DOSTOOLS\GHOST -CLONE,MODE=PLOAD,SRC=D:\GHOSTSYS\SYSTEM.GHO:1,DST=1:1 -SURE -RB GOTO END :BACKUP PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND SET TEMP=C:\DOSTOOLS\TEMP LH DOSTOOLS\COMMAND\DOSKEY LH DOSTOOLS\COMMAND\MOUSE LH DOSTOOLS\SMARTDRV.EXE IF NOT EXIST D:\GHOSTSYS\NUL MD D:\GHOSTSYS C:\DOSTOOLS\GHOST -Z9 -CLONE,MODE=PDUMP,SRC=1:1,DST=D:\GHOSTSYS\SYSTEM.GHO -SURE -FX ATTRIB +A +S +H +R D:\GHOSTSYS WIN /Z REBOOT GOTO END :TOOLS SET EXPAND=YES SET DIRCMD=/O:N SET LGLDRV=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15 SET LGLDRV=%LGLDRV% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C CALL DOSTOOLS\SETRAMD.BAT %LGLDRV% PATH %RAMD%:\DOSTOOLS;%RAMD%:\DOSTOOLS\COMMAND;%CDROM%:\ MKDIR %RAMD%:\DOSTOOLS MKDIR %RAMD%:\DOSTOOLS\COMMAND DOSTOOLS\COMMAND\ATTRIB -A -S -H -R \COMMAND.COM COPY COMMAND.COM %RAMD%:\>NUL DOSTOOLS\COMMAND\ATTRIB +A +S +H +R \COMMAND.COM COPY DOSTOOLS\*.* %RAMD%:\DOSTOOLS>NUL COPY DOSTOOLS\COMMAND\*.* %RAMD%:\DOSTOOLS\COMMAND>NUL MKDIR %RAMD%:\DOSTOOLS\TEMP SET TEMP=%RAMD%:\DOSTOOLS\TEMP SET TMP=%RAMD%:\DOSTOOLS\TEMP LH DOSTOOLS\COMMAND\DOSKEY LH DOSTOOLS\COMMAND\MOUSE LH DOSTOOLS\COMMAND\MSCDEX /D:ECSCD003 /E LH DOSTOOLS\SMARTDRV.EXE SET COMSPEC=%RAMD%:\COMMAND.COM SET CDROM= SET LGLDRV= :END 用您的批处理结果为 @ECHO OFF GOTO %CONFIG% PATH C:\DOSTOOLS;C:\DOSTOOLS\COMMAND SET TEMP=C:\DOSTOOLS\TEMP LH DOSTOOLS\COMMAND\DOSKEY LH DOSTOOLS\COMMAND\MOUSE LH DOSTOOLS\SMARTDRV.EXE IF NOT EXIST D:\GHOSTSYS\NUL MD D:\GHOSTSYS C:\DOSTOOLS\GHOST -Z9 -CLONE,MODE=PDUMP,SRC=1:1,DST=D:\GHOSTSYS\SYSTEM.GHO -SURE -FX ATTRIB +A +S +H +R D:\GHOSTSYS WIN /Z REBOOT 多出了一行GOTO %CONFIG% 能再看看吗?谢谢 [ Last edited by hbby on 2007-9-13 at 07:14 PM ]


2007-9-13 18:04
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ThinKing
中级用户





积分 471
发帖 207
注册 2007-5-3
状态 离线
『第 6 楼』:  

命令行执行:
for /f "delims=: tokens=1*" %a in ('findstr /n .* a.txt^|findstr "^1: ^13 ^14 ^15 ^16 ^17 ^18 ^19 ^20 ^21 ^22" ') do @echo\%b>>2.txt


2007-9-13 20:13
查看资料  发短消息  网志   编辑帖子  回复  引用回复
wxl7759
新手上路





积分 4
发帖 2
注册 2007-1-27
状态 离线
『第 7 楼』:  

我是来学习的


2007-9-13 21:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
acai
新手上路





积分 6
发帖 3
注册 2007-9-13
状态 离线
『第 8 楼』:  

学习学习,真是牛人


2007-9-13 22:24
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 9 楼』:  

set/p kk=<AUTOEXEC.BAK&call echo %%kk%%>2.txt
for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 22 echo %%j>>2.txt




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-9-14 09:59
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 10 楼』:  

老大就是厉害!已经解决!谢谢! 但是还存在问题 for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 32 echo %%j>>2.txt 如果到从13行到32行,在其中有个:tool,“:”这个特殊符号不能被导出!能再看看吗?谢谢 [ Last edited by hbby on 2007-9-14 at 10:50 AM ]


2007-9-14 10:36
查看资料  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 11 楼』:  

to hbby ThinKing的代码很简洁,正则表达式也是你应该掌握的技巧。我只是用另一种思路来完成罢了。




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-9-14 10:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 12 楼』:  

Originally posted by hbby at 2007-9-14 10:36: 老大就是厉害!已经解决!谢谢! 但是还存在问题 for /f "tokens=1* delims=:" %%i in ('findstr/n . AUTOEXEC.BAK') do if %%i geq 13 if %%i leq 32 echo %%j>>2.txt ...
以findstr /n 列出行数,就是以冒号为分隔符的,要想处理,一定要多写代码,所以建议还是用sed吧。很简单的,有空你可以学习一下。




三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。
2007-9-14 11:09
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 13 楼』:  

Originally posted by ccwan at 2007-9-14 11:09: 以findstr /n 列出行数,就是以冒号为分隔符的,要想处理,一定要多写代码,所以建议还是用sed吧。很简单的,有空你可以学习一下。
除了用SED就真的没有其他办法吗?各位高手再帮忙想想办法吧!谢谢大家!


2007-9-15 15:42
查看资料  发短消息  网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 14 楼』:  

for /f "delims=" %%i in ('findstr /n .* test.txt') do ( set /a mn=%%i 2>nul set "m=%%i" setlocal enabledelayedexpansion set m=!m:*:=! if !mn! LSS 2 echo.!m!>test2.txt if !mn! GEQ 13 if !mn! LEQ 22 echo.!m!>>test2.txt endlocal [ Last edited by terse on 2007-9-17 at 10:41 AM ]


2007-9-15 20:04
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
hbby
中级用户





积分 220
发帖 99
注册 2005-8-16
状态 离线
『第 15 楼』:  

Originally posted by terse at 2007-9-15 20:04: r /f "delims=" %%i in ('findstr /n .* test.txt') do ( set /a mn=%%i 2>nul set "m=%%i" setlocal enabledelayedexpansion set m=!m:*:=! ...
楼上的兄弟,没看明白,能写完整吗?谢谢!


2007-9-15 21:13
查看资料  发短消息  网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: