标题: [文本处理] 【已解决】findstr命令表达补集错误? [打印本页]
作者: bluewing009 时间: 2011-11-22 09:32 标题: 【已解决】findstr命令表达补集错误?
本帖最后由 bluewing009 于 2011-11-23 22:38 编辑
解决6楼
1.我想在1.txt文本里找到 不含 pause和echo 的显示行(显示行就是echo 没有>),就是:不含 pause和 echo且没有>的 行
我是这么写的:findstr /v "echo.*[^^^>] pause" 1.txt
结果错误
2.我尝试补集的写法findstr echo.*[^^^>] 1.txt
结果是:echo行和echo >行
问题:[^]不是补集么?应该是不含有补集内的元素,为什么2中都输出了
我如果想达到开头所说的目的如何写呢?
举例
- echo 000
- echo 3234
- pause
- djkllls
- dfsdk
- echo asdas>11.txt
- echo asdas>>11.txt
复制代码
变成
- djkllls
- dfsdk
- echo asdas>11.txt
- echo asdas>>11.txt
复制代码
例子中echo 行没有>排除了
作者: yyykkkyyyy 时间: 2011-11-22 16:23
我水平不行,这说的只可以试试,别当真了...
[] 里当然可以用补集,但不需要转义 [>] 和[^>] 但需要引号括起来
发生错误的原因,除了以为要转义外,主要是逻辑上有误,比如查的是 echo.*[^>] 那方括内不允许有“>”难道 “>” 不能包含在 .* 里么? 因此想要表达不允许有 > 符,必须把 .* 的 . 换成不允许有>才行,如果是加/v排除的写上要排除的那部分就行,没加/v 而用补集排除,那就得全匹配才能排除——不知我表达清楚没有
附上用于本题的命令还不知我理解题意没有,应该有点参考价值吧- findstr/v "echo[^>]*[>] pause" 1.txt
复制代码
作者: bluewing009 时间: 2011-11-22 23:01 标题: 标题
回复 2# yyykkkyyyy
/v echo[^>]*[>]的结果是显示echo 不包含>的行,与我的题意正好相反,但是我反推/v echo[^>]*[^>]应该是显示不包含“echo 没有>的”,结果所有echo都不显示……
作者: bluewing009 时间: 2011-11-22 23:09
然后我这样findstr echo[^>]*应该是显示echo且没有>的行吧?结果都显示了
作者: bluewing009 时间: 2011-11-22 23:19
本帖最后由 bluewing009 于 2011-11-22 23:23 编辑
奇怪的是如果直接写findstr [^>]*[^>] 按照理解应该显示“没有>”的行,结果除了开头为>没显示,其他都显示了,也包括行中间含有>
不明白……
还有findstr .*[^>]应该显示所有行尾不是>的行……但是也显示了……
作者: yyykkkyyyy 时间: 2011-11-22 23:44
回复 5# bluewing009
如果说我那句是正好相反,则把 /v 去掉就行了,我确实没明白你的题意,要不就是这个意思:- findstr/v "echo[^>]*$ pause" 1.txt
复制代码
总之, 你还是逻辑没理清,我这把有echo 不带 > 的和有echo 带 > 的两者选一都有例句了
作者: awk 时间: 2011-11-23 09:14
- grep -E -v "pause|echo.*>|>.*echo" a.txt
复制代码
作者: bluewing009 时间: 2011-11-23 10:23
本帖最后由 bluewing009 于 2011-11-23 10:27 编辑
回复 6# yyykkkyyyy
那就分条说
1.有一个文本,各种命令都有
2.其中echo命令的行可分为有>和没有>的两种情况
3.需要显示除echo外的命令,以及echo行中含有>的行
4.换句话说,就是把echo的单独行(只有echo没有>)剔除出去
这样说明白了么?
另:如果去掉v就变成findstr "echo[^>]*[>] pause" 1.txt
这句话就是:找到echo且有>的和pause的行……
作者: bluewing009 时间: 2011-11-23 10:25
回复 7# awk
额…………主要是findstr一般表达式运用不是很清楚……特别是补集
总是选不出希望的结果
作者: yyykkkyyyy 时间: 2011-11-23 10:54
回复 9# bluewing009
我都无话可说,如果说结果承认但想不通为什么我还可以解释。
把我6楼用代码贴出来的你测试的情况描述一下总可以吧?
作者: BS0小陈 时间: 2011-11-23 11:16
- findstr /v "^>echo echo.*>.* pause" 1.txt
复制代码
这样子行么?你们说的表示看不懂
作者: Hello123World 时间: 2011-11-23 19:17
- @echo off
- ::不含 pause和 echo且没有>的 行,就是没有pause、echo、>的行。
- findstr /lv "pause echo >" 1.txt
- pause
复制代码
作者: bluewing009 时间: 2011-11-23 20:06
回复 10# yyykkkyyyy
初步测试可以。先谢谢你解决问题~ 但是不是很明白原理.....
findstr/v "echo[^>]*$ pause" 1.txt
. 通配符: 任何字符
* 重复: 以前字符或类别出现零或零以上次数
^ 行位置: 行的开始
$ 行位置: 行的终点
[class] 字符类别: 任何在字符集中的字符
[^class] 补字符类别: 任何不在字符集中的字符
这句话我奇怪为什么$,这个“行的终点”怎么讲?
我自己写的 findstr/v "echo[^>]*[>][^>]* pause" 1.txt 我以为:
排除 (/v)echo行中间没有>重复,然后有> 的行
因为格式
echo dasdasds>1.txt
规律
echo 中间重复 > 其他不是>的字符
所以我照着搬下来 findstr/v "echo[^>]*[>][^>]*
但是结果为
复制代码
为何呢?
作者: bluewing009 时间: 2011-11-23 20:09
本帖最后由 bluewing009 于 2011-11-23 20:10 编辑
回复 12# Hello123World
这句话把所有echo 都打死了 thanks anyway
findstr /lv "pause echo >" 1.txt
这就排除了 含pause 行 含echo 行 含>行
而我需要的是 排除echo 且没有>的行......
6L可行
作者: yyykkkyyyy 时间: 2011-11-23 21:07
回复 13# bluewing009
结果是对的才说明我理解题意对了,现帮你解释一下 echo[^>]*$ 可能多半的意思都懂,我讲得浅别介意,说得不对请各位高手指正。
都知道 . 表任意字符,那么[^>] 就表示除 > 之外的任意字符了
* 表示前一字符的 0 次或任意次重复,(注意是两者合作用,就是说不加 * 前面字符肯定会有,加了* 则也可以前字符1次也没有)
$ 表行结尾
那么 .*$ 表示的一直到行尾可以是任意字符——等于什么也没限制
那么 [^>]*$ 就是一直到行尾,是除了 > 之外的任意字符,换句话说,一直到行尾不允许有 > 符
如果不加 $ 呢?也就是你自己写的,那表示的一行里的某部分匹配就行了,虽然前面限制不要 > 符,但后面再有 > 符还是符合条件的,所以用
[^>]*$ 表示延续限制,可以没有字符了,也可以有多少字符都行,但不允许有 > 符
所以 echo[^>]*$ 就是表示自出现echo开始,一直到行尾不允许有 > 符
也就是匹配的是 echo 后不带 > 符的,如果也要求前面不带呢,^[^>]*echo[^>]*$
(当然也可用/b /e /x 等匹配参数代)
这说的是匹配,那么前面有参数/v 当然正好是排除这种情况了
相信整句不会再有疑问了吧
作者: CrLf 时间: 2011-11-23 21:44
顶楼问题可以看这个帖子:
论正则表达式的“贪婪”性:sed一例
http://bbs.bathome.net/thread-12622-1-3.html
作者: bluewing009 时间: 2011-11-23 21:45 标题: 标题
回复 15# yyykkkyyyy
还是有疑问……
findstr/v echo[^>]*[>][^>]*
这样不就是echo 一段没有>的字符,然后是>,再加上一段没有>的字符,这不是符合echo adgjmptw >1.txt
但是为什么连echo adm这类的也算上了呢?这符合 echo[^>]*而不是 echo[^>]*[>][^>]*丫,这不是要求“echo 非>字符 > 非>字符”echo adm这句话没有>怎么也算上了呢?
作者: yyykkkyyyy 时间: 2011-11-23 22:13
回复 17# bluewing009
呵呵,逻辑性强的东西,我再解释就是说“绕口令”了,恐怕只有你自己绕得清,先考虑不要/v时匹配什么,加上/v 就是排除它,不要扰和一起...
作者: bluewing009 时间: 2011-11-23 22:36
回复 18# yyykkkyyyy
哎……我自己再琢磨一下吧,不过很感谢你帮我解决这个问题,代码就能精简一下了……
再次感谢~
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |