标题: [文本处理] [已解决]批处理读取在指定字符串的下一行字符串 [打印本页]
作者: pine 时间: 2009-9-18 12:00 标题: [已解决]批处理读取在指定字符串的下一行字符串
例如:
文本里有
abeeeeee
abcd
uuuuu
1:假设abcd和uuuuu这两条字符串是依附在一起的,行的位置没规定
2:假设UUUUU实际为任意字符
3:指定的字符串在TXT里可能不止一个
现在想读取abcd下面那行的字符串,如果以上面例子,就是想读取UUUUU这一行
谢谢,试过用for 还是想不出来,只知道skip是跳过第几行,eol是忽略,但这两个好像用不了,请帮忙
[ 本帖最后由 pine 于 2009-9-21 11:49 编辑 ]
作者: inittab 时间: 2009-9-18 12:24
- @echo off&setlocal enabledelayedexpansion
- set flag=0
- for /f "delims=" %%a in (a.txt) do (
- if "%%a"=="abcd" (set flag=1) else if !flag!==1 (set flag=0&echo;%%a)
- )
- pause
复制代码
[ 本帖最后由 inittab 于 2009-9-18 12:27 编辑 ]
作者: pine 时间: 2009-9-18 12:41
可以注释一下吗?你这个我看不懂
作者: Lumiere 时间: 2009-9-18 13:10
文本中有几条指定的行,情况不一样的。最好陈述清楚。- @echo off
- for /f "delims=:" %%a in ('findstr /n abcd a.txt') do set n=%%a
- for /f "skip=%n% delims=" %%a in (a.txt) do echo %%a&goto end
- :end
- pause>nul
复制代码
作者: inittab 时间: 2009-9-18 13:14
语句很简单。for + if的结构。主要是思路,代码是次要的。
第一次循环。没有发现abcd ,也没有flag=1. ,跳过,处理一行。
第二次循环。发现了abcd . 先做个标记(flag=1),处理下一行。
第三次循环。发现了flag=1 。显示这行内容。并同时把标记取消掉(flag=0)。为下次做准备。
然后不断重复这三个步骤,a.txt 中把abcd 所在的下一行,都显示出来。
作者: pine 时间: 2009-9-18 13:16
非常感谢你们两位,Lumiere 你写的我看懂了,但inittab麻烦你注释一下代码,我还是看不懂
作者: pine 时间: 2009-9-18 14:03 标题: 回复 2楼 的帖子
为什么改成这样就不行了?
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
if "%%a"=="abcd" set flag=1
if !flag!==1 set flag=0&echo %%a
)
pause
作者: pine 时间: 2009-9-18 15:43 标题: 回复 4楼 的帖子
嗯,我是漏了这一点,谢谢提醒,如果在TXT里不止这一个特定的字符串,该怎么做呢?
你的代码是当显示出下一行时,就强制终止,如果是多个特定字符串,怎么办?
作者: keen 时间: 2009-9-18 16:36 标题: 回复 8楼 的帖子
2楼的代码,面对多个特定字符串,也是可以用的。
作者: pine 时间: 2009-9-18 16:41
那为什么我改成这样就不可以?
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
if "%%a"=="abcd" set flag=1
if !flag!==1 set flag=0&echo %%a
)
pause
错在哪里呢?
作者: Lumiere 时间: 2009-9-18 16:58 标题: 回复 8楼 的帖子
所以让你提问的时候说清楚点,专业别人也不至于浪费了时间还不讨好。对于有多条特定字符串:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=:" %%a in ('findstr /n abcd a.txt') do set n=%%a&call :end !n!
- :end
- for /f "skip=%1 delims=" %%a in (a.txt) do echo %%a&goto :eof
- pause>nul
复制代码
作者: Lumiere 时间: 2009-9-18 17:04
在最后一个goto :eof后面加一个2>nul
作者: pine 时间: 2009-9-18 17:13 标题: 回复 11楼 的帖子
call :end !n! 后面怎么多个!n!
下面的skip=%1 怎么会是%1?
嗯,以后发贴我会想清楚再发,谢谢提醒,不好意思了,老麻烦大家,不过可以的话,希望你们能费点时间作个代码注释,详细说明下代码原理,这样有助于新手们看,自己去消化理解,有时注释的内容可以让我们更进一步增益自己的思路;老是问了问题解决后就取现成的代码,我自己都觉得都尴尬了
作者: Lumiere 时间: 2009-9-18 17:20 标题: 回复 13楼 的帖子
其实这些问题都是因为你没入门引起的。建议先去把论坛的基本帖子扫一遍,消化一下。要不人家不可能什么基本的语句语法功能都要给你注释的。
作者: pine 时间: 2009-9-18 17:33
嗯,回头我多看看基础命令,刚的问题麻烦你看一下,你的代码出错,另外
call :end !n! 后面怎么多个!n!
下面的skip=%1 怎么会是%1?
作者: inittab 时间: 2009-9-18 18:18 标题: 回复 7楼 的帖子
抱歉,刚上来.
回答一下7 10楼的疑问:
if ... else if .... else if ..... else .. 这样的句式 看起来很长,但它其实是一条命令。只会执行一次。就是说执行了set flag=1 以后(或中间某段),不管后边是什么都被跳过。进入a.txt 的下一行。到了下一行后把该行显示出来。
但是如果是:
if ...()
if ...()
这种就不一样了。执行完第一个if .会接着执行第二个if . (相当对同一行内容执行了两个命令),所以第二个if 直接把当前行给打印出来了,而不是下一行。
如果是多个关健字的话。少数的有限的几个的话,可以再多加几个 else if .比如增加 defg 为关健字.可以这样写.
if "%%a"=="abcd" (set flag=1) else if "%%a"=="defg" (set flag=1) else if !flag!==1 (set flag=0&echo;%%a)
如果关健字很多的话。可以把关健字存放到另一个文件。比如b.txt 中。然后用for 取出b.txt作为变量。再代放abcd处判断。 如果要取abcd 前一行或N行。或取abcd 下一行或N行。都是可以实现的。
关健在于实际需求来写代码。
所以,请楼主把问题补全更新到顶楼。 论坛高手很多。 看看大家有没有更好的,更简洁巧妙的思路。
[ 本帖最后由 inittab 于 2009-9-18 18:40 编辑 ]
作者: pine 时间: 2009-9-18 20:34
明白了,谢谢。
另外麻烦Lumiere能讲一下你最后写的代码,好像有错
作者: Lumiere 时间: 2009-9-18 20:48 标题: 回复 15楼 的帖子
刚才我的代码有个小瑕疵,就是第二个for结束以后还会再执行一次下面的end 部分,我写的时候没注意到,只要在第一个for之后加一句exit就可以了,或者在第二个for之后加2>nul也可以,因为这个错误不会影响执行结果,2>nul的意思就是将错误输出屏蔽。至于call :end 加参数是call的基本句式之一,后面的!n!参数可以传递给下面的%i。比如call :example n1 n2 就带了两个参数,这样就可以再后面设置两个参数%1 %2.以此类推。
作者: pine 时间: 2009-9-19 10:09 标题: 回复 11楼 的帖子
我还是有点看不懂,在论坛搜了 CALL关于参数的,没找到,所以理解不过来,麻烦你讲解一下,谢谢
skip=%1 为什么这里会有%1, CALL :END !n! 后面的!n!是参数,是代表什么呢,就这两个不理解
作者: a904055262 时间: 2009-9-19 10:21
- @echo off
- call :end 1 2 3
- :end
- echo %1
- echo %2
- echo %3
- pause
复制代码
保存 运行下 你就知道什么是什么意思了
作者: a904055262 时间: 2009-9-19 10:22
[attach]1863[/attach]
作者: Lumiere 时间: 2009-9-19 10:25 标题: 回复 19楼 的帖子
这里借用C++里面参数调用的说法,就是将call还有标签后面的实参传递到要调用的代码段中%1 %2 %3 等等代表的形参中去。20已经给出很明朗的代码,如果楼主还不懂的话,那我也爱莫能助了。
作者: pine 时间: 2009-9-21 11:48
明白了,谢谢楼上几位朋友
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |