优秀的编程知识分享平台

网站首页 > 技术文章 正文

DOS批处理命令:强大的find及findstr查找字符串搜索,坑也不少

nanyue 2024-12-27 15:44:20 技术文章 3 ℃

两个都是搜索字符串,但findstr比find强大多了,find一看就明白,以下主要介绍findstr。虽说功能强大,但与汉字结合使用通配符时问题不少。

find :

作用:在文件中搜索字符串。

格式:FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  • /V 显示所有未包含指定字符串的行。
  • /C 仅显示包含字符串的行数。
  • /N 显示行号。
  • /I 搜索字符串时忽略大小写。
  • /OFF[LINE] 不要跳过具有脱机属性集的文件。
  • "string" 指定要搜索的文本字符串。
  • [drive:][path]filename 指定要搜索的文件。

如果没有指定路径,FIND 将搜索在提示符处键入的文本或者由另一命令产生的文本。

注意:find要搜索的字符串要加双引号,没有搜索通配符功能


findstr :

作用:在文件中寻找字符串。

格式:FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file] [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]] strings [[drive:][path]filename[ ...]]

  • /B 在一行的开始配对模式。
  • /E 在一行的结尾配对模式。
  • /L 按字使用搜索字符串。
  • /R 将搜索字符串作为一般表达式使用(作正则表达式)。
  • /S 在当前目录和所有子目录中搜索匹配文件。
  • /I 指定搜索不分大小写。
  • /X 打印完全匹配的行。
  • /V 只打印不包含匹配的行。
  • /N 在匹配的每行前打印行数。
  • /M 如果文件含有匹配项,只打印其文件名。
  • /O 在每个匹配行前打印字符偏移量。
  • /P 忽略有不可打印字符的文件。
  • /OFF[LINE] 不跳过带有脱机属性集的文件。
  • /A:attr 指定有十六进位数字的颜色属性。请见 "color /?"
  • /F:file 从指定文件读文件列表 (/ 代表控制台)。
  • /C:string 使用指定字符串作为文字搜索字符串。
  • /G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。

在文件subFileSearch.txt里查找/G:file指定的文件subFile.txt里的关键行(按行查)

  • /D:dir 查找以分号为分隔符的目录列表
  • strings 要查找的文字。
  • [drive:][path]filename 指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串

例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或"there"。'FINDSTR /C:"hello there" x.y' 文件 x.y 寻找"hello there"。

一般表达式的快速参考:

  • . 通配符: 任何一个字符,不管前面后面都必须匹配一个字符。
  • * 重复: 用在字符之后,字符或类之后出现零或零以上次数
  • ^ 行位置: 行的开始
  • $ 行位置: 行的终点
  • [class] 字符类: 只要任意一个字符在字符集中。不能是汉字、双引号
  • [^class] 补字符类: 任何不在字符集中的字符
  • [x-y] 范围: 在指定范围内的任何字符
  • \x Escape: 元字符 x 的文字用法
  • \<xyz 字位置: 一行中以xyz开始
  • xyz\> 字位置: 一行中以xyz的结束
  • \<xyz\> 精确查找xyz

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。


对 比

  • find搜索的字符串要加双引号,findstr可不加。
  • find不能加通配符搜索,findstr可以。
  • find不支持正则表达式,findstr默认用正则表达式。

特殊说明 :

坑一:“我们”在字符串里,但没查到

原因:可能是汉字与字母混用时的一个BUG

解决:加个/i或/r开关,最好先用/i

坑二:两个汉字间用“.”代表一个汉字时查不到

原因:汉字是双字节的,而“.”只代表一个字符。dir中的“?”也代表一个字符,但没这样的问题

解决:再加一个“.”或“*”

坑三:“.*”代表了“们伟大”三个字?但用“*.”代替却不行

坑四:开关“/r”与两个“*”,即“**”,同用时会显示“findstr:没有搜索字符串”的错误

坑五:有没有“*”好像结果都一样

Tags:

最近发表
标签列表