使用 batchfile、findstr 在 txt 文件中搜索精确数字

使用 batchfile、findstr 在 txt 文件中搜索精确数字

我正在尝试使用批处理文件搜索文本文件中存储的精确数字。文件如下所示:

1, 2, 4, 11, 18, 19, 25, 35, 42, 66, 87, 89.......

问题是为了避免出现误报,例如当我这样做时:

findstr "1" sometxtfile.txt > output

...它还找到数字 11 等等。

我通过以下方法解决了这个问题:

findstr /R \<1\> sometxtfile.txt > output

但是数字必须存储在变量中,当我这样做时:

findstr /R "\<%variable%,\> sometxtfile.txt > output

...命令行没有响应。

它必须是批量解决方案。

答案1

对于以逗号 + 空格(或制表符)分隔的提取编号:

@echo off 

setlocal EnableDelayedExpansion 

for /f useback^tokens^=*delims^= %%i in (`type Q1597471.txt
`)do set "_line=%%~i" && for %%X in (!_line:^, ^= !)do echo=%%~X

endlocal & goto :eof
  • 文件内容Q1597471.txt...
0, 1, 2, 4, 11, 18, 19, 25, 35, 42, 66, 87, 89
10, 11, 12, 14, 111, 118, 119, 125, 135, 142, 166, 187, 189
210, 211, 212, 214, 2111, 2118, 2119, 2125, 2135, 2142, 2166, 2187, 2189
  • 输出:
0
1
2
4
11
18
19
25
35
42
66
87
89
10
11
12
14
111
118
119
125
135
142
166
187
189
210
211
212
214
2111
2118
2119
2125
2135
2142
2166
2187
2189


对于我的不同理解(可能是错误的),那就是将同一行上的所有数字连接起来。


@echo off 

cd /d "%~dp0"
setlocal EnableDelayedExpansion

for /f useback^tokens^=*delims^= %%N in (`type Q1597471.txt`)do set/a "_cnt=1" & for /f %%X in ('
%ComSpec% /u /c set/p "'=%%~N"^<nul^|find.exe /v " "^|findstr.exe [0-9]^|find.exe /v /c ""
')do for /f %%n in ('%ComSpec%/u/c set/p "'=%%~N"^<nul^|find.exe /v " "^|findstr.exe [0-9]
')do if %%~X equ 1 (echo\%%~n) else if %%~X equ !_cnt! (echo=!_n: =!%%~n && set "_n="
     ) else (set /a "_cnt+=1" && call set "_n=!_n!%%~n")
    
endlocal & goto :eof

综合起来,这个字母汤将:

  1. 逐行统计数字的出现次数

  2. 每行的流量将给出我需要提取/编写每行的数字

  3. 数字告诉我每次循环(最后一次)我将回答多少次连接变量的输出(逐位)

如果我不明白,请告诉我,我的英语很糟糕...当前的输入/输出是这样的:

线路输入:1, 2, 4, 11, 18, 19, 25, 35, 42, 66, 87, 89
线路输出124111819253542668789


观察:1.comma在包含+Tabcomma+ 的文件中测试space

观察:2。把该bat放在同一文件夹内,编辑文件名为Q1597471.txt文件名/目标。

答案2

无需为此使用正则表达式。如果文件始终像这样并且格式稳定,则只需使用普通的文字字符串匹配即可

findstr /C:" %variable%," sometxtfile.txt

/C选项是使其匹配空格所必需的。但它需要每个文件都以空格开头,以空格结尾,因此,您可能必须在它们的末尾添加前缀和后缀,。如果您不能这样做,那么您需要使用真正的正则表达式引擎,因为看起来的findstr单词边界匹配存在一些问题。PowerShell 有这个,因为它已经包含在 .NET 中。为什么它必须是批处理专用的?PowerShell 随处可用十多年,如果您从批处理中调用,则只需要这行简单的代码:

powershell -C "sls '\b%variable%\b' sometxtfile.txt"
# Or the full command
powershell -Command "Select-String '\b%variable%\b' sometxtfile.txt"

如果您想更改输出格式,该命令可能需要进行一些调整


请注意,你的这个命令findstr /R \<1\> sometxtfile.txt > output 不起作用. 它给出了以下错误

该系统找不到指定的文件。

这是因为<被识别为输入重定向器。您必须像这样引用它findstr /R "\<1\>" sometxtfile.txt或将其转义findstr /R \^<1\^> sometxtfile.txt。但这两种方法都会findstr因某种原因无限期挂起。避免findstr使用 的正则表达式功能,因为它非常有限且有缺陷

最后一条命令也有错误。它缺少一个结束引号,如果不以,我之前提到的结尾,它将无法匹配最后一个数字

                           ↓ Missing closing quote
findstr /R "\<%variable%,\> sometxtfile.txt > output
                        ↑ why comma here but not in the above command?

相关内容