![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-13 10:45 |
共 47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论]findstr的命令行分析机制 |
| 可打印版本 11,217 / 11 |
| 第1楼 willsort | 发表于 2006-06-10 22:46 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
[讨论]findstr的命令行分析机制 To All:
问题缘起于bsijl一篇关于findstr错误过滤的主题,当时因为无法找到原因,所以只能推测 /g 开关存在某些问题。 近日,因为编写一个debuger代码,再次使用了 findstr/g ,结果遇到了同样的问题。经过仔细的测试后,发现是 findstr 特殊的命令行分析机制所引起的问题。略述如下: 1、findstr不同于早期的find,它对参数的排列有一定的要求,即遵循开关(可省略)、字符串(使用/c开关时省略)、文件名(可通配、可多个、有输入流时需省略)的顺序。 2、开关可以使用引号,所以不能直接以与开关相同的关键字进行搜索;文件名含空格时必须用引号。 3、搜索关键字的情况和表现就比较复杂,分述如下: 3-1、无论是否使用开关/l或/r以及是否使用引号,关键字中的\都会成为转义字符,所以\\将成为\,\"将使引号失去字符串界定作用; 3-2、搜索关键字可加或不加引号,当加引号时其中的\可能会再次转义。使用开关/l和/r时的转义结果可能会不同:当使用/r时,所以"\\\\"将成为单个\,"\\"将使关键字为空;当使用/l或均不使用时,"\\\\"和"\\"与单个\等价。 3-3、如果关键字以单个\结尾,且无引号,则不会被转义; 而 findstr/g出现的问题,应该与上述内容有关,但其内在机理仍无法透彻理解。不知各位有何高见? 批处理删除XP输入法问题!请dos高手解决 http://www.cn-dos.net/forum/search.php?searchid=24472 Test of findstr/v/g
Test of findstr [ Last edited by willsort on 2006-6-11 at 18:38 ] |
|
| 第2楼 Climbing | 发表于 2006-06-11 01:18 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
在我的XP上这个结果如何解释?
d:\work>findstr /v /g:envar.out envar.out FINDSTR: 搜索字符串太长。 d:\work>findstr /v /g:envar.out envar.out FINDSTR: 搜索字符串太长。 d:\work>findstr /v /g:envar.out FINDSTR: 搜索字符串太长。 |
|
| 第3楼 无奈何 | 发表于 2006-06-11 03:02 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
在我的 XP 下和 willsort 兄 3、的描述相同。这个恼人的结果不知道能不能确定是 FINDSTR 的 BUG ,请朋友们多试一下其它系统的情况。看来关键字中含有 “\” 字符应该多加小心了。
|
|
| 第4楼 3742668 | 发表于 2006-06-11 14:43 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
唔,似乎只有当\后面的字符为非字母和非数字的时候才会出错。感觉microsoft准备把findstr做成cmd下的正则表达式工具似的,但是又没有考虑到与其他参数之间的兼容性,导致最后的结果是画虎不成反类犬。
另外在某些时候,findstr的查找字符串中包含中文时,需要加上/i参数才能避免错误,具体环境以及代码已忘,或许findstr除了正则表达式方面的bug外还存在unicode与ascii转换的bug。 |
|
| 第5楼 willsort | 发表于 2006-06-11 18:24 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re Ups:
另外一个问题: 因为开关也允许引号,所以无法以 "/l" 或 "/r" 等与开关相同的文本串作为关键字匹配,下面的句式将会出错: echo /l /r > test findstr /l "/r" test 不过,可以使用开关 /c 来强制指定关键字: findstr /l /c:"/r" test findstr /l /c:/r test 还有一个方法,就是上文提到的 \ 了: findstr /l \/r test 此外,这个 \ 还可以让我们的关键字中包含引号: echo /l /r >test echo "/r" >> test findstr /l \"/r\" test 最后,修订和增补顶楼3-2中的一些描述: 3-2、开关/r和开关/l相同,其后的关键字均可使用或不使用引号;使用引号时: 3-2-1、"\"和"\\\"等价于引号和其后各个串所各自代表的多个关键字; 3-2-2、"\\\\\"和"\\\\\\\"等价于引号加\组成的关键字和其他多个关键字; 3-2-3、"\\\\\\\\\"等价于引号加\\组成的关键字和其他多个关键字; 3-2-4、"\ ","\\","\\\ ","\\\\\ ","\\\\\\","\\\\\\\ "等价于空; 3-2-5、"\\ ","\\\\"等价于一个\; 3-2-6、"\\\\ ","\\\\\\\\"等价于两个\; 3-2-7、"\\\\\\ "等价于三个\; 3-2-8、"\\\\\\\\ "等价于四个\; 以上数据由以下方法测得,测试文件见,当不使用/r开关与使用开关/l相同,; type test1.txt | findstr /r "test_key" test2.xt Test text of findstr - "test1.txt"
Test text of findstr - "test2.txt"
[ Last edited by willsort on 2006-6-11 at 18:25 ] |
|
| 第6楼 220110 | 发表于 2006-06-17 21:07 |
| 荣誉版主 发帖 313 积分 718 | |
3-2、开关/r和开关/l相同,其后的关键字均可使用或不使用引号;使用引号时: 我早前也发现这规律存在路径名上,只是没深入研究,没敢贴上来. 我是从"dir .\", " dir ..\" 开始,大家不妨测试下. |
|
| 第7楼 willsort | 发表于 2006-06-18 18:19 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
Re 220110:
UNC 路径名中 \ 的解析与 findstr 关键字是不同的,它只有界定目录的作用,而没有转义字符的作用。 |
|
| 第8楼 jackerloo2009 | 发表于 2009-06-27 00:18 |
| 新手上路 发帖 1 积分 1 | |
|
echo 王志慧|findstr /i ".*净"
加/i 仍然是个错误 还有对于/l参数仍不明了 findstr /v /x /i /g:B.txt A.txt findstr /v /x /i /g:A.txt B.txt 我曾经比较过两个文本,里面都是邮件地址,结果不加/l的话结果中出来了一个共同点 两个文本中都有这个地址 p*.tournois@chello.fr 但比较不同后的结果仍然还是有这个地址。但是加了/l后避免了,对于这个/l按字使用搜索字符串,如何理解?所有的都变成普通字符逐字比较? |
|
| 第9楼 echoair | 发表于 2009-11-11 13:04 |
| 新手上路 发帖 33 积分 8 | |
|
希望大家能把findstr的基本用法系统做个总结…
|
|
| 第10楼 hongcheng668 | 发表于 2009-11-16 15:43 |
| 新手上路 发帖 9 积分 10 | |
|
不错 学习了
|
|
| 第11楼 hongcheng668 | 发表于 2009-11-16 15:43 |
| 新手上路 发帖 9 积分 10 | |
|
呵呵 厉害
|
|
| 第12楼 hongcheng668 | 发表于 2009-11-16 15:43 |
| 新手上路 发帖 9 积分 10 | |
|
能不能详细点
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |