Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 查找包含所有字符串的行_Batch File_Cmd - Fatal编程技术网

Batch file 查找包含所有字符串的行

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 您的方法完全不切实际,因为您需要每个置换,它是字符串数

我想搜索一个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

您的方法完全不切实际,因为您需要每个置换,它是字符串数的阶乘:

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