找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26811|回复: 5

[转贴] [转]findstr命令行分析机制

[复制链接]
发表于 2008-1-6 21:26:13 | 显示全部楼层 |阅读模式
问题缘起于bsijl一篇关于findstr错误过滤的主题[1],当时因为无法找到原因,所以只能推测
                              /g 开关存在某些问题。
                                    近日,因为编写一个debuger代码,再次使用了 findstr/g
                              ,结果遇到了同样的问题[2]。经过仔细的测试[3]后,发现是 findstr
                              特殊的命令行分析机制所引起的问题。略述如下:
                                    
                              1、findstr不同于早期的find,它对参数的排列有一定的要求,即遵循开关(可省略)、字符串(使用/c开关时省略)、文件名(可通配、可多个、有输入流时需省略)的顺序。
                                    
2、开关可以使用引号,所以不能直接以与开关相同的关键字进行搜索;文件名含空格时必须用引号。
                                    3、搜索关键字的情况和表现就比较复杂,分述如下:
                                    
                              3-1、无论是否使用开关/l或/r以及是否使用引号,关键字中的\都会成为转义字符,所以\\将成为\,\"将使引号失去字符串界定作用;
                                    
                              3-2、搜索关键字可加或不加引号,当加引号时其中的\可能会再次转义。使用开关/l和/r时的转义结果可能会不同:当使用/r时,所以"[url=]\\\\[/url]"将成为单个\,"\\"将使关键字为空;当使用/l或均不使用时,"[url=]\\\\[/url]"和"\\"与单个\等价。
                                    3-3、如果关键字以单个\结尾,且无引号,则不会被转义;
                                    而
                              findstr/g出现的问题,应该与上述内容有关,但其内在机理仍无法透彻理解。不知各位有何高见?
                              [1]批处理删除XP输入法问题!请dos高手解决
                              http://www.cn-dos.net/forum/search.php?searchid=24472
                              [2]Test of findstr/v/g

                                  Quote:
                                E:\Batch\Test>set > envar.out
                                E:\Batch\Test>findstr /v /g:envar.out envar.out
                                LOGONSERVER=\\Test
                                ProgramFiles=C:\Program Files
                                E:\Batch\Test>findstr /v /i /g:envar.out
                                envar.out
                                LOGONSERVER=\\Test

                              [3]Test of findstr
                                CODE:  [Copy to clipboard]

                                :: Test of findstr
                                :: Will Sort - 2006-06-10 - CMDWinXP
                                @echo off
                                cls&echo ---- "set>_tfs1.tmp & findstr /v
                                /g:_tfs1.tmp _tfs1.tmp"
                                set>_tfs1.tmp & findstr /v /g:_tfs1.tmp
_tfs1.tmp
                                pause
                                echo ---- "findstr /v /i /g:_tfs1.tmp _tfs1.tmp"
                                findstr /v /i /g:_tfs1.tmp _tfs1.tmp
                                pause
                                echo ---- "sort /r _tfs1.tmp > _tfs2.tmp &
                                findstr /v /g:_tfs1.tmp _tfs2.tmp"
                                sort /r _tfs1.tmp > _tfs2.tmp & findstr /v
                                /g:_tfs1.tmp _tfs2.tmp
                                pause
                                echo ---- "set|findstr /v /g:_tfs1.tmp"
                                set|findstr /v /g:_tfs1.tmp
                                pause
                                cls&echo ---- "dir C:\ /w > _tfs2.tmp & findstr
                                /v /g:_tfs2.tmp _tfs2.tmp"
                                dir C:\ /w > _tfs2.tmp & findstr /v /g:_tfs2.tmp
                                _tfs2.tmp
                                pause
                                echo ---- "echo :\ > _tfs2.tmp & findstr /v
                                /g:_tfs2.tmp _tfs2.tmp"
                                echo :\ > _tfs2.tmp & findstr /v /g:_tfs2.tmp
                                _tfs2.tmp
                                pause
                                cls&echo ---- "findstr /g:_tfs1.tmp
                                _tfs1.tmp>_tfs2.tmp & fc _tfs1.tmp _tfs2.tmp"
                                findstr /g:_tfs1.tmp _tfs1.tmp>_tfs2.tmp & fc
                                _tfs1.tmp _tfs2.tmp
                                pause
                                cls&echo ---- "set|findstr /r "[url=]\\\\[/url]  [url=]\\\\[/url]""
                                set|findstr /r "[url=]\\\\[/url]  [url=]\\\\[/url]"
                                pause
                                echo ---- "set|findstr /l "[url=]\\\\[/url]  [url=]\\\\[/url]""
                                set|findstr /l "[url=]\\\\[/url]  [url=]\\\\[/url]"
                                pause
                                cls&echo ---- "echo _tfs1_tmp > _tfs1.tmp &
                                findstr "/l" "_tfs1.tmp" "_tfs1.tmp""
                                echo _tfs1_tmp >> _tfs1.tmp & findstr
                                "_tfs1.tmp" "_tfs1.tmp"
                                pause
                                del _tfs?.tmp
发表于 2009-1-6 13:09:41 | 显示全部楼层

好贴没人顶?

俺来捧捧场,但是还是对于*号不太理解,希望有人指点一下.
发表于 2009-1-6 13:49:15 | 显示全部楼层
[url=]\\\\[/url]
这用在findstr会出问题吧?
[]符号如果是要当字元搜寻的话就必须要加转义符号,但开L的话就不用
\[\]
  1. C:\1>echo [url]\\[/url]| findstr -LI "\[url\]\\\\\[\/url\]"
  2. [url]\\[/url]

  3. C:\1>echo [url]\\[/url]| findstr -RI "\[url\]\\\\\[\/url\]"
  4. [url]\\[/url]

  5. C:\1>echo [url]\[/url]| findstr -RI "\[url\]\\\\\[\/url\]"

  6. C:\1>echo [url]\[/url]| findstr -LI "\[url\]\\\\\[\/url\]"

  7. C:\1>echo [url]\[/url]| findstr -RI "[url]\\\\[/url]"

  8. C:\1>echo [url]\\[/url]| findstr -RI "[url]\\\\[/url]"

  9. C:\1>echo [url]\\[/url]| findstr -LI "[url]\\\\[/url]"
  10. [url]\\[/url]

  11. C:\1>echo [url]\[/url]| findstr -LI "[url]\\\\[/url]"

  12. C:\>
复制代码

[ 本帖最后由 sylovanas 于 2009-1-6 13:52 编辑 ]
发表于 2009-1-6 14:01:27 | 显示全部楼层
*
  1. c:\>echo.123         456|findstr -C:"123 *456"

  2. c:\>echo.123         456|findstr -RC:"123 *456"
  3. 123         456

  4. c:\>echo.123         456|findstr "123 *456"
  5. 123         456

  6. c:\>echo.123         456|findstr -C:"123 *456"

  7. c:\>echo.123    1    456|findstr "123 *456"
  8. 123      1  456

  9. c:\>echo.123    1    456|findstr -RC:"123 *456"
复制代码
C开关R开关L开关各有针对不同正则表示..
发表于 2009-1-6 15:21:04 | 显示全部楼层

回复 4楼 的帖子

谢了兄弟,哈,终于搞明白了,原来正则表示需要和那些开关一起使用啊!
发表于 2009-1-6 18:11:41 | 显示全部楼层

回复 5楼 的帖子

正则表达式不一定要和那些开关一起使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:47 , Processed in 0.013300 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表