Batch file 查找包含所有字符串的行
我想搜索一个txt文件,只找到包含所有字符串的行。最小值为1,最大值为4 我做了一些研究,从它的工作中得到了这段代码,但只针对2个字符串Batch file 查找包含所有字符串的行,batch-file,cmd,Batch File,Cmd,我想搜索一个txt文件,只找到包含所有字符串的行。最小值为1,最大值为4 我做了一些研究,从它的工作中得到了这段代码,但只针对2个字符串 findstr /irc:"!str[1]!.*!str[2]!" /c:"!str[2]!.*!str[1]!" %MINDEX% 我如何使用此代码?有更好的办法吗 搜索字符串!str[1]!到str[4]!: 搜索到的Txt文件%MINDEX%: 期望输出: 123 bbb ccc 321 aaa 您的方法完全不切实际,因为您需要每个置换,它是字符串数
findstr /irc:"!str[1]!.*!str[2]!" /c:"!str[2]!.*!str[1]!" %MINDEX%
我如何使用此代码?有更好的办法吗
搜索字符串!str[1]!到str[4]!:
搜索到的Txt文件%MINDEX%:
期望输出:
123 bbb ccc 321 aaa
您的方法完全不切实际,因为您需要每个置换,它是字符串数的阶乘:
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
在这种情况下,您可以从文件读取字符串来动态生成过滤器
@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个字符,因此使用这种方法时字符串的大小可能会有问题 这里有一个解决方案:在大文件上也应该非常快速
@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
这将使用aacini提供的名为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
OP的要求似乎是以任意顺序选择包含所有字符串的行。dbenham解决方案级联findstr中的可疑输入错误显示[1][2][2][3]-修改为[1][2][3][4]。我刚刚在for循环中添加了if DEFINED str[%%%N],在其他命令之前,现在它可以处理任意数量的变量。谢谢各位。
@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
@echo off
(
echo aaa aaa bbb ccc 123
echo 123 bbb ccc 321 aaa
echo 321 ccc aaa eee ddd
)>file.txt