[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 编辑 ]
技术问题请到论坛发帖求助!

本帖最后由 尘丶 于 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
复制代码

TOP

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

TOP

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


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

类似于C里面的指针?

为什么只能放在call里输出

TOP

嗯丶…这个可以用到for 语句!

TOP

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

TOP

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

TOP

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

TOP

也来一个,呵呵
  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
复制代码

TOP

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

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

TOP

原帖由 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 " ...



能否讲解一下你的代码呢,有些看不懂,谢谢

TOP

回复 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 编辑 ]
(*^_^*)

TOP

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

TOP

我也来试试

我的思路跟 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 编辑 ]

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

返回列表