找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 59508|回复: 27

【出题】批处理按特定条件查找文本内容

[复制链接]
发表于 2008-5-24 01:06:01 | 显示全部楼层 |阅读模式
a.txt

  1. sdfgsdfgsdfg
  2. 上dfhgjs正确
  3. abcddfja;正确
  4. sdfg下正确
  5. sdfgsdgs
  6. sdfgsdgsdg
  7. 55555555555
  8. sg上fg正确
  9. abcd正确
  10. sdfg下gf正确
  11. fgfdgsdfg
  12. 77777777777
  13. 上fdg正确dsfg
  14. abcddkfja
  15. dfsg下dfsg正确
  16. tuytutyuy
  17. gfhgfh
  18. sdghj上dfg正确
  19. abcd正确
  20. sdg下sdg正确
复制代码


要求一:显示a.txt中以 abcd 开头的行和它的上一行。
要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行。


[ 本帖最后由 随风 于 2008-5-24 01:35 编辑 ]
发表于 2008-6-1 22:44:42 | 显示全部楼层
我的答案:
要求一
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. set count=0
  5. goto :loop
  6. :up
  7. set /a count=!n!-2
  8. for /f "skip=%count% tokens=*" %%j in (a.txt) do (
  9.     echo %%j>>b.txt
  10.     goto :eof
  11.     )
  12. :loop
  13. for /f "tokens=*" %%i in (a.txt) do (
  14.     set /a n+=1
  15.     set temp=%%i
  16.     if "!temp:~0,4!"=="abcd" (
  17.     echo %%i>>b.txt
  18.     call :up
  19.     )
  20.     )
  21. start b.txt
复制代码
要求二
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=0
  4. set count=0
  5. goto :loop
  6. :up
  7. set /a count=!n!-2
  8. for /f "skip=%count% tokens=*" %%j in (a.txt) do (
  9.     echo %%j>>b.txt
  10.     goto :eof
  11.     )
  12. :low
  13. set /a count=!n!
  14. for /f "skip=%count% tokens=*" %%j in (a.txt) do (
  15.     echo %%j>>b.txt
  16.     goto :eof
  17.     )
  18. :loop
  19. for /f "tokens=*" %%i in (a.txt) do (
  20.     set /a n+=1
  21.     set temp=%%i
  22.     if "!temp:~0,4!"=="abcd" (
  23.     echo %%i>>b.txt
  24.     call :up
  25.     call :low
  26.     )
  27.     )
  28. start b.txt
复制代码
如果原文件以abcd开头行出现的位置<2的话就要加判断语句,否则会报错.
不过按照楼主的a.txt文件,我测试是通过的.

[ 本帖最后由 springcm 于 2008-6-2 07:59 编辑 ]

评分

参与人数 1PB +5 收起 理由
随风 + 5 鼓励

查看全部评分

发表于 2008-6-8 12:41:02 | 显示全部楼层
set /a count=!n!-2
for /f "skip=%count% tokens=*" %%j in (a.txt) do (.....
其中的conut在loop循环时一直为零,直到call   :up时值才改变,楼主可否解释一下这个count,我有点搞不懂......
发表于 2008-6-8 20:04:34 | 显示全部楼层
  1. :: 在标签:loop处,我用了
  2. set /a n+=1
  3. :: 相当于FOR 语句每处理一行N值递增1.
  4. set /a count=!n!-2
  5. :: 然后把n-2赋值给变量count
复制代码
发表于 2008-6-8 22:04:39 | 显示全部楼层
哦,终于弄明白了,我没有看到n在变化.....
谢谢!!!
 楼主| 发表于 2008-6-8 22:25:48 | 显示全部楼层
呵呵,不错,加分鼓励!
但可以更简洁,支持一题多解。
争取在一个for里循环一次就完成。
发表于 2008-6-13 14:14:18 | 显示全部楼层
要求一:显示a.txt中以 abcd 开头的行和它的上一行。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type a.txt') do (
  4.    set /a n+=1,m=n-1
  5.    set _!n!=%%a
  6.    set str=%%a
  7.    if "!str:~,4!"=="abcd" call echo %%_!m!%%&call echo %%_!n!%%
  8. )
  9. pause
复制代码
要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('type a.txt') do (
  4.    set /a a+=1
  5.    set _!a!=%%a
  6. )
  7. for /f "delims=" %%a in ('type a.txt') do (
  8.    set /a n+=1,o=n+1,m=n-1
  9.    set _!n!=%%a
  10.    set str=%%a
  11.    if "!str:~,4!"=="abcd" call echo %%_!m!%%&call echo %%_!n!%%&call echo %%_!o!%%
  12. )
  13. pause
复制代码

评分

参与人数 1PB +4 收起 理由
springcm + 4 studying

查看全部评分

发表于 2008-6-18 00:54:37 | 显示全部楼层
呵呵,又是这道题啊。
发表于 2008-8-21 11:16:09 | 显示全部楼层
只用一个for完成要求2
cls&@echo off&setlocal enabledelayedexpansion
set a1=不存在&set a2=不存在
for /f "tokens=*" %%i in (a.txt) do (
   
set a0=!a1!&set a1=!a2!&set a2=%%i
   
if "!a1:~0,4!" equ "abcd" echo 上一行:  !a0!&echo abcd开头:!a1!&echo 下一行:  !a2!&echo.
)
if "%a2:~0,4%" equ "abcd" echo 上一行:  !a1&echo abcd开头:!a2!&echo 下一行:  不存在&echo.
pause&goto:eof

运行结果

上一行:  上dfhgjs正确
abcd开头:abcddfja;正确
下一行:  sdfg下正确

上一行:  sg上fg正确
abcd开头:abcd正确
下一行:  sdfg下gf正确

上一行:  上fdg正确dsfg
abcd开头:abcddkfja
下一行:  dfsg下dfsg正确

上一行:  sdghj上dfg正确
abcd开头:abcd正确
下一行:  sdg下sdg正确

请按任意键继续. . .

评分

参与人数 1PB +4 收起 理由
sjzong + 4 厉害,但是第七行代码中的“!a1”,应该改为 ...

查看全部评分

发表于 2008-9-2 17:38:25 | 显示全部楼层
哇,这个好难
发表于 2008-9-2 18:36:59 | 显示全部楼层
@echo off
setlocal enabledelayedexpansion
set n=0
set before=不存在
set beforebefore=不存在
for /f "delims=" %%i in (a.txt) do (
    set cur=%%i
    if "!before:~0,4!"=="abcd" (
        echo ------------
        echo 上一行:!beforebefore!
        echo 当前行:!before!
        echo 下一行:%%i
        echo _____________
    )
    set beforebefore=!before!
    set before=!cur!
)

这是第二道题目,第一个更简单哦
发表于 2008-9-5 09:09:25 | 显示全部楼层
不会!

学习中!!!!!!!
发表于 2008-9-15 18:50:48 | 显示全部楼层
  1. @echo off
  2. for /f "tokens=1* delims=:" %%c in ('findstr /n /b "abcd" a.txt') do call :zd n %%c %%d
  3. pause
  4. goto :eof
  5. :zd
  6.  set %1=%2
  7.  set/a m=%n%-1
  8.  for /f "tokens=1* delims=:" %%i in ('findstr /n . a.txt') do call :s2 f %%i %%j
  9.  goto :eof
  10. :s2
  11.  set %1=%2
  12.  if %f%==%m% echo %3
  13.  if %f%==%n% echo %3&echo.
复制代码
上为两行,下为三行的。上下思路没改
  1. @echo off
  2. for /f "tokens=1* delims=:" %%c in ('findstr /n /b "abcd" a.txt') do call :zd n %%c %%d
  3. pause
  4. goto :eof
  5. :zd
  6.  set %1=%2
  7.  set/a m=%n%-1
  8.  set/a k=%n%+1
  9.  for /f "tokens=1* delims=:" %%i in ('findstr /n . a.txt') do call :s2 f %%i %%j
  10.  goto :eof
  11. :s2
  12.  set %1=%2
  13.  if %f%==%m% echo %3
  14.  if %f%==%n% echo %3
  15.  if %f%==%k% echo %3&echo.
复制代码

顺便问下,我怎么给别人评分阿?

[ 本帖最后由 wxcute 于 2008-9-15 19:00 编辑 ]
发表于 2009-4-4 23:22:15 | 显示全部楼层
答案一:

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%i in ('findstr /n "abcd" a.txt') do (
  3.     set a=%%i
  4.     set /a a-=1
  5.     for /f "tokens=1,2 delims=:" %%m in ('findstr /n .* a.txt') do if %%m==!a! echo %%n
  6.     echo %%j
  7. )
  8. pause
复制代码


答案二:

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%i in ('findstr /n "abcd" a.txt') do (
  3.     set a=%%i
  4.     set /a a-=1
  5.     for /f "tokens=1,2 delims=:" %%m in ('findstr /n .* a.txt') do if %%m==!a! echo %%n
  6.     echo %%j
  7.     set b=%%i
  8.     set /a b+=1
  9.     for /f "tokens=1,2 delims=:" %%x in ('findstr /n .* a.txt') do if %%x==!b! echo %%y
  10. )
  11. pause
复制代码
发表于 2009-4-5 14:26:52 | 显示全部楼层
要求一
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in (a.txt) do (
  3. echo %%i|findstr "abcd">nul&&echo %%i &&echo !m!
  4. set m=%%i )
  5. pause
复制代码
考虑到a文本中只要有abcd,都是位于开头部分,所以没有进行判断。只要存在abcd字符串即符合条件。
要求二
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=0
  3. for /f %%i in (test.txt) do (
  4. if !n!==1 ( echo %%i&set n=0 )
  5. echo %%i|findstr "abcd">nul&&echo %%i&&echo !m!&&set n=1
  6. set m=%%i )
  7. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:47 , Processed in 0.025076 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表