[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何查找匹配多个关键字的行数

限制要求:关键字里含有空格以及特殊符号。


本来想用个for %%a in (%关键字%) do 的,但是关键字里有空格,这样并不能做到。。

但是定义多个关键字略嫌麻烦,所以还请赐教。

不太明白,能否举个例子?

TOP

回复 2# CrLf


  1. @echo off & setlocal enabledelayedexpansion
  2. (
  3.     ::定义_key变量,前缀必须是_key,后边无所谓,_key**都行。
  4.     set "_key1=canyue"
  5.     set "_key2=cod 4"
  6.     set "_key3=^"
  7.     set "_key4=521"
  8. )
  9. set "filename=a.txt"
  10. for /f "tokens=2* delims==" %%f in ('set _key') do set /a keynum+=1
  11. for /f "tokens=* delims=" %%i in (%filename%) do (
  12.     set /a oknum=0
  13.     for /f "tokens=2* delims==" %%f in ('set _key') do (echo %%i | findstr "%%f">nul && set /a oknum+=1)
  14.     if !oknum! equ !keynum! echo %%i
  15. )
  16. pause
复制代码



类似于这种功能。

a.txt
  1. aabccanyueqq !@#%"""""""^()@%@^@$^#%&#%|}{{{<><><>,..()()()(;;;;cod 4
  2. abccanyueqq !@#%^()@%@^@$"""""""^#%&#%|}{{{<><><>,..()()()(;;;;
  3. qweqwecanyue asdasdqarWT#$%"""""%^*^* aa qq cqc canyueppc cod 4 521
复制代码


匹配的关键字
  1. canyue
  2. 521
  3. ^
  4. cod 4
复制代码


结果是
  1. qweqwecanyue asdasdqarWT#$%"""""%^*^* aa qq cqc canyueppc cod 4 521
复制代码

TOP

本帖最后由 canyuexiaolang 于 2012-7-12 01:14 编辑

回复 2# CrLf



还得显示行号

还有总共匹配的行数。。

TOP

findstr 要想同时匹配多个关键词只好用管道了,关键词含空格只能用 /c 开关来携带参数,若关键词中正则语法中的特殊字符可用 "\" 将其转义或用 /c 开关关闭正则
  1. findstr /n "canyue" 1.txt|findstr /c:"cod 4"|findstr /c:"^"|findstr "521"
复制代码

TOP

回复 5# CrLf

不能定义多个关键字么


set 关键字=1 asdasd asfhd
那样的。。

我觉得不行,但是别人这么要求的。。

TOP

回复 6# canyuexiaolang


不太明白兄台的意思,

如果是问如何将含空格的不定数量的关键词依次 findstr,那么有几种比较常见的办法:
  1. findstr /g:关键词列表.txt  a.txt
复制代码
  1. for %%a in (关键词1 "关 键 词 2") do findstr /c:"%%~a"  a.txt
复制代码
  1. set key="关键词1" "关 键 词 2" "key3"
  2. findstr /c:%key:" "=" /c:"%  a.txt
复制代码
如果是问能否只用一句findstr同时匹配所有关键词,那是没办法的,findstr 中的关键词是并列关系,所以虽然可以在一个 findstr 中使用多个关键词,但匹配时只要符合其中之一即输出,例:
  1. @echo off
  2. echo 匹配其一:
  3. more +7 %0|findstr /c:"t e s t" /c:"abc" /c:"123"
  4. echo 同时符合所有关键词:
  5. more +7 %0|findstr /c:"t e s t"|findstr /c:"abc"|findstr /c:"123"
  6. pause&exit
  7. t e s t
  8. abcdefg
  9. 123 test abc
复制代码

TOP

回复 7# CrLf

感谢感谢

TOP

返回列表