我正在尝试使用批处理文件搜索文本文件中存储的精确数字。文件如下所示:
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, 4, 11, 18, 19, 25, 35, 42, 66, 87, 89
线路输出124111819253542668789
观察:1.comma
在包含+Tab
和comma
+ 的文件中测试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?