查找包含所有字符串的行

时间:2014-10-19 14:05:40

标签: batch-file cmd

我想搜索txt文件,只查找包含所有字符串的行。有min = 1和max = 4字符串。

我进行了一些研究,我从ss64得到了这个代码,但只有2个字符串。

findstr /irc:"!str[1]!.*!str[2]!" /c:"!str[2]!.*!str[1]!" %MINDEX%

我如何使用此代码?还有更好的方法吗?

搜索字符串(!str[1]!!str[4]!):

aaa
bbb
123
321

搜索的Txt文件(%MINDEX%):

aaa aaa bbb ccc 123
123 bbb ccc 321 aaa
321 ccc aaa eee ddd

期望的输出:

123 bbb ccc 321 aaa

3 个答案:

答案 0 :(得分:0)

你接近是完全不切实际的,因为你需要每个permutaton,这是字符串数量的阶乘:

1! =   1
2! =   2
3! =   6
4! =  24
5! = 120
6! = 720

解决方案是一次搜索一个字符串,将一个搜索结果输入下一个字符串,直到所有字符串都用完为止。看起来您的搜索字词是字符串文字,因此不需要正则表达式。

findstr /ic:"!str[1]!" "%mindex%" | findstr /ic:"!str[2]!" | findstr /ic:"!str[3]!" | findstr /ic:"!str[4]!"

[编辑:Magoo - 见评论]

命令行长度限制为8192字节,因此可以串联在一起的FINDSTR命令数量有限制。另外,随着字符串数量的增加,这也变得不切实际。

概括解决方案的最后一步是迭代搜索字符串。

copy "%mindex%" result.txt
for /l %%N in (1 1 %maxN%) do (
  findstr /ic:"!str[%%N]!" result.txt >result.txt.tmp
  move /y result.txt.tmp result.txt
)
type result.txt
del result.txt

答案 1 :(得分:0)

您可以动态生成过滤器(在这种情况下,从文件中读取字符串)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "filter= "
    for /f "usebackq delims=" %%a in ("strings.txt") do (
        setlocal enabledelayedexpansion
        for /f "delims=" %%b in ("!filter!") do (
            endlocal
            set "filter=%%b | find /i "%%~a" "
        )
    )

    type "data.txt" %filter% > "output.txt"

但是由于命令行限制为8192个字符,因此字符串的大小可能是这种方法的问题。

答案 2 :(得分:0)

这是一个解决方案:对于大文件也应该非常快

@echo off
set str[1]=aaa
set str[2]=bbb
set str[3]=123
set str[4]=321

setlocal enabledelayedexpansion
type "file.txt" | findrepl "^(?=.*!str[1]!)(?=.*!str[2]!)(?=.*!str[3]!)(?=.*!str[4]!).*$" /i
pause

这使用名为findrepl.bat的助手批处理文件(由aacini提供) - 从以下网址下载:https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

findrepl.bat放在与批处理文件相同的文件夹中或路径上。

创建测试文件:

@echo off
(
echo aaa aaa bbb ccc 123
echo 123 bbb ccc 321 aaa
echo 321 ccc aaa eee ddd
)>file.txt