标题: 【出题】批处理按特定条件查找文本内容 [打印本页]
作者: 随风 时间: 2008-5-24 01:06 标题: 【出题】批处理按特定条件查找文本内容
a.txt
- sdfgsdfgsdfg
- 上dfhgjs正确
- abcddfja;正确
- sdfg下正确
- sdfgsdgs
- sdfgsdgsdg
- 55555555555
- sg上fg正确
- abcd正确
- sdfg下gf正确
- fgfdgsdfg
- 77777777777
- 上fdg正确dsfg
- abcddkfja
- dfsg下dfsg正确
- tuytutyuy
- gfhgfh
- sdghj上dfg正确
- abcd正确
- sdg下sdg正确
复制代码
要求一:显示a.txt中以 abcd 开头的行和它的上一行。
要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行。
[ 本帖最后由 随风 于 2008-5-24 01:35 编辑 ]
作者: springcm 时间: 2008-6-1 22:44
我的答案:
要求一- @echo off
- setlocal enabledelayedexpansion
- set n=0
- set count=0
- goto :loop
- :up
- set /a count=!n!-2
- for /f "skip=%count% tokens=*" %%j in (a.txt) do (
- echo %%j>>b.txt
- goto :eof
- )
- :loop
- for /f "tokens=*" %%i in (a.txt) do (
- set /a n+=1
- set temp=%%i
- if "!temp:~0,4!"=="abcd" (
- echo %%i>>b.txt
- call :up
- )
- )
- start b.txt
复制代码
要求二- @echo off
- setlocal enabledelayedexpansion
- set n=0
- set count=0
- goto :loop
- :up
- set /a count=!n!-2
- for /f "skip=%count% tokens=*" %%j in (a.txt) do (
- echo %%j>>b.txt
- goto :eof
- )
- :low
- set /a count=!n!
- for /f "skip=%count% tokens=*" %%j in (a.txt) do (
- echo %%j>>b.txt
- goto :eof
- )
- :loop
- for /f "tokens=*" %%i in (a.txt) do (
- set /a n+=1
- set temp=%%i
- if "!temp:~0,4!"=="abcd" (
- echo %%i>>b.txt
- call :up
- call :low
- )
- )
- 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
- :: 在标签:loop处,我用了
- set /a n+=1
- :: 相当于FOR 语句每处理一行N值递增1.
- set /a count=!n!-2
- :: 然后把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 开头的行和它的上一行。- @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 "!str:~,4!"=="abcd" call echo %%_!m!%%&call echo %%_!n!%%
- )
- pause
复制代码
要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行。- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('type a.txt') do (
- set /a a+=1
- set _!a!=%%a
- )
- for /f "delims=" %%a in ('type a.txt') do (
- set /a n+=1,o=n+1,m=n-1
- set _!n!=%%a
- set str=%%a
- if "!str:~,4!"=="abcd" call echo %%_!m!%%&call echo %%_!n!%%&call echo %%_!o!%%
- )
- 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
- @echo off
- for /f "tokens=1* delims=:" %%c in ('findstr /n /b "abcd" a.txt') do call :zd n %%c %%d
- pause
- goto :eof
- :zd
- set %1=%2
- set/a m=%n%-1
- for /f "tokens=1* delims=:" %%i in ('findstr /n . a.txt') do call :s2 f %%i %%j
- goto :eof
- :s2
- set %1=%2
- if %f%==%m% echo %3
- if %f%==%n% echo %3&echo.
复制代码
上为两行,下为三行的。上下思路没改- @echo off
- for /f "tokens=1* delims=:" %%c in ('findstr /n /b "abcd" a.txt') do call :zd n %%c %%d
- pause
- goto :eof
- :zd
- set %1=%2
- set/a m=%n%-1
- set/a k=%n%+1
- for /f "tokens=1* delims=:" %%i in ('findstr /n . a.txt') do call :s2 f %%i %%j
- goto :eof
- :s2
- set %1=%2
- if %f%==%m% echo %3
- if %f%==%n% echo %3
- if %f%==%k% echo %3&echo.
复制代码
顺便问下,我怎么给别人评分阿?
[ 本帖最后由 wxcute 于 2008-9-15 19:00 编辑 ]
作者: keen 时间: 2009-4-4 23:22
答案一:
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=:" %%i in ('findstr /n "abcd" a.txt') do (
- set a=%%i
- set /a a-=1
- for /f "tokens=1,2 delims=:" %%m in ('findstr /n .* a.txt') do if %%m==!a! echo %%n
- echo %%j
- )
- pause
复制代码
答案二:
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1,2 delims=:" %%i in ('findstr /n "abcd" a.txt') do (
- set a=%%i
- set /a a-=1
- for /f "tokens=1,2 delims=:" %%m in ('findstr /n .* a.txt') do if %%m==!a! echo %%n
- echo %%j
- set b=%%i
- set /a b+=1
- for /f "tokens=1,2 delims=:" %%x in ('findstr /n .* a.txt') do if %%x==!b! echo %%y
- )
- pause
复制代码
作者: cainiao736 时间: 2009-4-5 14:26
要求一- @echo off&setlocal enabledelayedexpansion
- for /f %%i in (a.txt) do (
- echo %%i|findstr "abcd">nul&&echo %%i &&echo !m!
- set m=%%i )
- pause
复制代码
考虑到a文本中只要有abcd,都是位于开头部分,所以没有进行判断。只要存在abcd字符串即符合条件。
要求二- @echo off&setlocal enabledelayedexpansion
- set n=0
- for /f %%i in (test.txt) do (
- if !n!==1 ( echo %%i&set n=0 )
- echo %%i|findstr "abcd">nul&&echo %%i&&echo !m!&&set n=1
- set m=%%i )
- pause
复制代码
作者: sjzong 时间: 2009-5-2 16:24 标题: 我也来试试
我的思路跟 more 一样的,只是增加判断第一行就含有abcd时,就没有上一行;判断最后一行含有abcd时,就没有下一行。还有个前提a.txt中不能有空行的,否则就跑题了。
要求一:
- @echo off
- setlocal enabledelayedexpansion
- set/a m=0
- for /f %%a in (a.txt) do (
- set/a n=!m!
- set/a m+=1
- set t!m!=%%a
- set str=%%a
- if "!str:~0,4!"=="abcd" (
- if !n!==0 (call echo 上 一 行:没有上一行) else (call echo 上 一 行:%%t!n!%%)
- echo abcd开头行:%%a
- echo.))
- pause
复制代码
要求二:- @echo off
- setlocal enabledelayedexpansion
- set/a m=0
- for /f %%a in (a.txt) do (set/a m+=1&set t!m!=%%a)
- for /l %%b in (1 1 !m!) do (
- set/a a=%%b-1&set/a b=%%b+1
- call set str=!t%%b!
- if "!str:~0,4!"=="abcd" (
- if !a!==0 (call echo 上 一 行:没有上一行) else (call echo 上 一 行:%%t!a!%%)
- call echo abcd开头行:%%t%%b%%
- if !b! gtr !m! (call echo 下 一 行:没有下一行) else (call echo 下 一 行:%%t!b!%%)
- echo.))
- 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的:- '直接做的要求二。要回答要求一:把代码中的"& ArrLine(i+1) & vbCrLf"去掉就行了
- '没有考虑第一行和最后一行是abcd的情况
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- Set objTextFile = objFSO.OpenTextFile("a.txt", 1)
-
- AllStr = objTextFile.ReadAll
- ArrLine = Split(AllStr, vbCrLf)
-
- For i = 0 To Ubound(ArrLine)
- If Left(ArrLine(i), 4) = "abcd" Then
- newStr = newStr & ArrLine(i-1) & vbCrLf & ArrLine(i) & vbCrLf & ArrLine(i+1) & vbCrLf
- End If
- Next
- 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
也来一个,呵呵
-
- @echo off
- setlocal enabledelayedexpansion
- for /f "skip=2 delims=[]" %%a in ('find /n "abcd" a.txt') do (
- set temp_=
- for /f "delims=" %%b in (a.txt) do (
- set /a temp_+=1
- set /a temp_a=!temp_!+1
- set /a temp_b=!temp_!-1
- if !temp_a! == %%a echo 上一行:%%b
- if !temp_b! == %%a echo 下一行:%%b
- )
- )
- pause
复制代码
作者: zgq0301 时间: 2009-11-14 18:35
借鉴7楼的要求一的做法,做了要求二^^- rem 要求二:显示a.txt中以 abcd 开头的行和它的上一行及下一行
- @echo off&setlocal enabledelayedexpansion
- set /a i=1
- for /f "delims=" %%a in (a.txt) do (
- set /a i+=1,j=i+1,k=j+1
- set _!k!=%%a
- call set str=%%_!j!%%
- if "!str:~,4!"=="abcd" ( call echo 上一行:%%_!i!%%&call echo 此行:%%_!j!%%&call echo 下一行:%%_!k!%% )
- )
- pause>nul
复制代码
[ 本帖最后由 zgq0301 于 2009-11-14 18:48 编辑 ]
作者: Seter 时间: 2009-11-14 19:22
- @echo off&setlocal enabledelayedexpansion
- echo 每个上一行:
- 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!
- echo.&echo 每个上下行&echo.
- 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!
- del tmp&pause
复制代码
作者: ccr438758900 时间: 2009-12-25 17:15
- 第一题
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (set a=%%i
- if "!a:~0,4!"=="abcd" (echo !b!&echo %%i)
- set b=%%i)
- pause
复制代码
- 第二题
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (
- if !a!==b (echo !c!&echo !d!&echo %%i&set a=)
- set w=%%i&if "!w:~0,4!"=="abcd" (set a=b)
- if !a!==b (set d=%%i) else (set c=%%i)
- )
- 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
一.- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- echo;%%a|findstr "^abcd">nul&&(
- echo;%%a
- if not "!num!"=="" echo;!num!
- )
- set num=%%a
- )
- pause
复制代码
二- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- if !n!==2 echo;%%a&set n=
- echo;%%a|findstr "^abcd">nul&&(
- echo;%%a&set /a n+=2
- if not "!num!"=="" echo;!num!
- )
- set num=%%a
- )
- pause
复制代码
作者: 尘丶 时间: 2015-8-10 17:19
本帖最后由 尘丶 于 2015-8-10 17:21 编辑
二- @echo off&setlocal enabledelayedexpansion
- setlocal enabledelayedexpansion
- (for /l %%a in (1,1,30) do set/p n%%a=)<1.txt
- for /f "delims=" %%a in (1.txt) do (
- set num=%%a&set /a n+=1&set /a s=!n!-1&set /a k=!n!+1
- if "!num:~,4!"=="abcd" (
- call,echo;上一行:%%n!s!%%
- echo;%%a
- call,echo;下一行:%%n!k!%%
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |