[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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 编辑 ]
技术问题请到论坛发帖求助!

我的答案:
要求一
  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 编辑 ]
1

评分人数

TOP

set /a count=!n!-2
for /f "skip=%count% tokens=*" %%j in (a.txt) do (.....
其中的conut在loop循环时一直为零,直到call   :up时值才改变,楼主可否解释一下这个count,我有点搞不懂......

TOP

  1. :: 在标签:loop处,我用了
  2. set /a n+=1
  3. :: 相当于FOR 语句每处理一行N值递增1.
  4. set /a count=!n!-2
  5. :: 然后把n-2赋值给变量count
复制代码
Welcome back to the world, grab a spoon - old friends

TOP

哦,终于弄明白了,我没有看到n在变化.....
谢谢!!!

TOP

呵呵,不错,加分鼓励!
但可以更简洁,支持一题多解。
争取在一个for里循环一次就完成。
技术问题请到论坛发帖求助!

TOP

要求一:显示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
复制代码
1

评分人数

TOP

呵呵,又是这道题啊。
***共同提高***

TOP

只用一个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正确

请按任意键继续. . .
1

评分人数

    • sjzong: 厉害,但是第七行代码中的“!a1”,应该改为 ...PB + 4
高手=发现问题^分析问题^解决问题

TOP

哇,这个好难

TOP

@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!
)

这是第二道题目,第一个更简单哦

TOP

不会!

学习中!!!!!!!

TOP

  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 编辑 ]

TOP

答案一:
  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
复制代码
(*^_^*)

TOP

要求一
  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
复制代码

TOP

返回列表