Board logo

标题: 【出题】批处理按特定条件查找文本内容 [打印本页]

作者: 随风    时间: 2008-5-24 01:06     标题: 【出题】批处理按特定条件查找文本内容

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 编辑 ]
作者: springcm    时间: 2008-6-1 22:44

我的答案:
要求一
  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 编辑 ]
作者: tangfu    时间: 2008-6-8 12:41

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

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

作者: tangfu    时间: 2008-6-8 22:04

哦,终于弄明白了,我没有看到n在变化.....
谢谢!!!
作者: 随风    时间: 2008-6-8 22:25

呵呵,不错,加分鼓励!
但可以更简洁,支持一题多解。
争取在一个for里循环一次就完成。
作者: more    时间: 2008-6-13 14:14

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

作者: batman    时间: 2008-6-18 00:54

呵呵,又是这道题啊。
作者: dishuo    时间: 2008-8-21 11:16

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

请按任意键继续. . .

作者: z_berry    时间: 2008-9-2 17:38

哇,这个好难
作者: z_berry    时间: 2008-9-2 18:36

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

这是第二道题目,第一个更简单哦
作者: jellyhk    时间: 2008-9-5 09:09

不会!

学习中!!!!!!!
作者: wxcute    时间: 2008-9-15 18:50

  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 编辑 ]
作者: keen    时间: 2009-4-4 23:22

答案一:
  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
复制代码

作者: cainiao736    时间: 2009-4-5 14:26

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

作者: sjzong    时间: 2009-5-2 16:24     标题: 我也来试试

我的思路跟 more 一样的,只是增加判断第一行就含有abcd时,就没有上一行;判断最后一行含有abcd时,就没有下一行。还有个前提a.txt中不能有空行的,否则就跑题了。
要求一:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/a m=0
  4. for /f %%a in (a.txt) do (
  5. set/a n=!m!
  6. set/a m+=1
  7. set t!m!=%%a
  8. set str=%%a
  9. if "!str:~0,4!"=="abcd" (
  10. if !n!==0 (call echo 上  一  行:没有上一行) else (call echo 上  一  行:%%t!n!%%)
  11. echo abcd开头行:%%a
  12. echo.))
  13. pause
复制代码

要求二
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set/a m=0
  4. for /f %%a in (a.txt) do (set/a m+=1&set t!m!=%%a)
  5. for /l %%b in (1 1 !m!) do (
  6. set/a a=%%b-1&set/a b=%%b+1
  7. call set str=!t%%b!
  8. if "!str:~0,4!"=="abcd" (
  9.   if !a!==0 (call echo 上  一  行:没有上一行) else (call echo 上  一  行:%%t!a!%%)
  10.   call echo abcd开头行:%%t%%b%%
  11.   if !b! gtr !m! (call echo 下  一  行:没有下一行) else (call echo 下  一  行:%%t!b!%%)
  12.   echo.))
  13. pause
复制代码


[ 本帖最后由 sjzong 于 2009-5-2 16:49 编辑 ]
作者: sjzong    时间: 2009-5-2 17:06     标题: re 9楼 和14楼

9楼:disuo兄的代码,的确厉害用一个for就可以实现了!!佩服!其中代码中的第7行中的“!a1”,应该改为“!a1!”。
14楼:keen兄的思路还是值得学习的,但是这个代码中的 findstr /n "abcd" a.txt' 显示的是a.txt所有还有abcd的行,跟本题题意以abcd开头有点偏差了!!

[ 本帖最后由 sjzong 于 2009-5-2 17:40 编辑 ]
作者: keen    时间: 2009-10-13 15:53     标题: 回复 17楼 的帖子

findstr /n "abcd" a.txt的确是找到的是所有含有abcd的行。

来个VBS的:
  1. '直接做的要求二。要回答要求一:把代码中的"& ArrLine(i+1) & vbCrLf"去掉就行了
  2. '没有考虑第一行和最后一行是abcd的情况
  3. Set objFSO = CreateObject("Scripting.FileSystemObject")
  4. Set objTextFile = objFSO.OpenTextFile("a.txt", 1)
  5. AllStr = objTextFile.ReadAll
  6. ArrLine = Split(AllStr, vbCrLf)
  7. For i = 0 To Ubound(ArrLine)
  8.     If Left(ArrLine(i), 4) = "abcd" Then
  9.         newStr = newStr & ArrLine(i-1) & vbCrLf & ArrLine(i) & vbCrLf & ArrLine(i+1) & vbCrLf
  10.     End If
  11. Next
  12. WSH.Echo newStr
复制代码

[ 本帖最后由 keen 于 2009-10-13 15:54 编辑 ]
作者: pine    时间: 2009-10-21 23:12

原帖由 more 于 2008-6-13 14:14 发表
要求一:显示a.txt中以 abcd 开头的行和它的上一行。@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type a.txt') do (
   set /a n+=1,m=n-1
   set _!n!=%%a
   set str=%%a
   if " ...



能否讲解一下你的代码呢,有些看不懂,谢谢
作者: fhsyj    时间: 2009-10-22 15:50

我也刚学批处理,试着来帮楼上解释一下,如不正确还望有人能帮我指正一下,别让我误导了人家,呵呵!

setlocal enabledelayedexpansion      开启延迟变量开关
for /f "delims=" %%a in ('type a.txt') do (    获取a.txt文件中的一行给变量%%a.  "delims=" 没有分隔符就是获取整行,如果有分隔符如: "delims= " 就是遇到
                                                                 空格结束,忽略空格后的字符,'type a.txt' 应该是以查看方式打开a.txt文件,
   set /a n+=1,m=n-1     以数字表达式方式给n,m赋值,n+=1 for 语句循环一次加1.
   set _!n!=%%a        把%%a 的值传递给n ,!n! 应该是立刻刷新变量的值, _   下划线用于储藏空间,作为变量的输出 ( 只对紧跟其后的变量有效)
                                  呵呵,这 个下划线不太熟悉!!
   set str=%%a       把变量%%a 的值传递给str
   if " ...

[ 本帖最后由 fhsyj 于 2009-10-22 15:52 编辑 ]
作者: lxzzr    时间: 2009-10-24 11:22

也来一个,呵呵
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "skip=2 delims=[]" %%a in ('find /n "abcd" a.txt') do (
  4.       set temp_=
  5.       for /f "delims=" %%b in (a.txt) do (
  6.            set /a temp_+=1
  7.            set /a temp_a=!temp_!+1
  8.            set /a temp_b=!temp_!-1
  9.            if !temp_a! == %%a echo 上一行:%%b
  10.            if !temp_b! == %%a echo 下一行:%%b
  11.       )
  12. )
  13. pause
复制代码

作者: zgq0301    时间: 2009-11-14 18:35

借鉴7楼的要求一的做法,做了要求二^^
  1. rem 要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行
  2. @echo off&setlocal enabledelayedexpansion
  3. set /a i=1
  4. for /f "delims=" %%a in (a.txt) do (
  5.    set /a i+=1,j=i+1,k=j+1
  6.    set  _!k!=%%a
  7.    call set str=%%_!j!%%
  8.     if "!str:~,4!"=="abcd" ( call echo 上一行:%%_!i!%%&call echo 此行:%%_!j!%%&call echo 下一行:%%_!k!%% )
  9.     )
  10. pause>nul
复制代码

[ 本帖最后由 zgq0301 于 2009-11-14 18:48 编辑 ]
作者: Seter    时间: 2009-11-14 19:22

  1. @echo off&setlocal enabledelayedexpansion
  2. echo 每个上一行:
  3. for /f "delims=:" %%i in ('findstr /n ^^abcd text.txt') do set/at=%%i-2&more +!t! text.txt>tmp&set/pt=<tmp&echo !t!
  4. echo.&echo 每个上下行&echo.
  5. for /f "delims=:" %%i in ('findstr /n ^^abcd text.txt') do set/at=%%i-2&more +!t! text.txt>tmp&set/pt=<tmp&echo !t!&more +%%i text.txt>tmp&set/pt=<tmp&echo !t!
  6. del tmp&pause
复制代码

作者: ccr438758900    时间: 2009-12-25 17:15

  1. 第一题
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (1.txt) do (set a=%%i
  5. if "!a:~0,4!"=="abcd" (echo !b!&echo %%i)
  6. set b=%%i)
  7. pause
复制代码
  1. 第二题
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in (1.txt) do (
  5. if !a!==b (echo !c!&echo !d!&echo %%i&set a=)
  6. set w=%%i&if "!w:~0,4!"=="abcd" (set a=b)
  7. if !a!==b (set d=%%i) else (set c=%%i)
  8. )
  9. pause
复制代码

作者: 634175535    时间: 2010-4-26 16:01

嗯丶…这个可以用到for 语句!
作者: hankerer    时间: 2011-9-11 19:23

要求一:显示a.txt中以 abcd 开头的行和它的上一行。要求二:显示a.txt中以 abcd 开头的行和它的上一行及下 ...
more 发表于 2008-6-13 14:14


谁能解释一下这个 _!n!的用法吗?

类似于C里面的指针?

为什么只能放在call里输出
作者: 尘丶    时间: 2015-8-10 17:00

一.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     echo;%%a|findstr "^abcd">nul&&(
  4.     echo;%%a
  5.     if not "!num!"=="" echo;!num!
  6.     )
  7.     set num=%%a
  8. )
  9. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     if !n!==2 echo;%%a&set n=
  4.     echo;%%a|findstr "^abcd">nul&&(
  5.     echo;%%a&set /a n+=2
  6.     if not "!num!"=="" echo;!num!
  7.     )
  8.     set num=%%a
  9. )
  10. pause
复制代码

作者: 尘丶    时间: 2015-8-10 17:19

本帖最后由 尘丶 于 2015-8-10 17:21 编辑

  1. @echo off&setlocal enabledelayedexpansion
  2. setlocal enabledelayedexpansion
  3. (for /l %%a in (1,1,30) do set/p n%%a=)<1.txt
  4. for /f "delims=" %%a in (1.txt) do (
  5. set num=%%a&set /a n+=1&set /a s=!n!-1&set /a k=!n!+1
  6. if "!num:~,4!"=="abcd" (
  7.     call,echo;上一行:%%n!s!%%
  8.     echo;%%a
  9.     call,echo;下一行:%%n!k!%%
  10.   )
  11. )
  12. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2