我想搜索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
答案 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