我目前正在尝试编写一个批处理脚本,此时,我需要找到一个字符串“null”,并确定它在文件中显示的次数。
每次脚本启动时,我都会从网站下载 API,并且他们的 API 中不时出现“null”。下载他们的 API 时,它会被下载到一行中,我一直在尝试这样做:
findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt
但由于文件只有一行长,因此仅显示“1”。
还有其他方法可以输出文件中“null”的次数吗?
由 barlop 添加
OP 也刚刚提到他无法安装第三方软件。
答案1
我相信这个问题之前已经有人问过并回答过了。但这里有一个简单的批处理脚本可以完成这个任务。
::StringCount String File
::
:: Count the number of times that String appears in File.
:: The search is not case sensitive.
:: Enclosing quotes are not considered to be part of the string.
:: The string cannot contain =
::
@echo off
setlocal disableDelayedExpansion
set count=0
for /f usebackq^ delims^=^ eol^= %%A in (%2) do set "ln=%%A"&call :testLine %1
echo %count%
exit /b
:testLine
setlocal enableDelayedExpansion
:testLine2
if defined ln if "!ln:*%~1=!" neq "!ln!" (
set /a count+=1
set "ln=!ln:*%~1=!"
goto testLine2
)
endlocal & set /a count=%count%
exit /b
命令行用法
StringCount null yourFile.txt
对于较大的文件来说,这可能会变得相当慢。
我写过混合 JScript/批处理实用程序,称为 REPL.BAT可以使工作变得简单,并且应该相当快。该实用程序对从 stdin 读取的行执行正则表达式搜索和替换,并将结果写入 stdout。它有相当多的选项,包括简化此任务的选项。该实用程序是纯脚本,可以在 XP 及以后的任何现代 Windows 机器上运行。完整文档嵌入在脚本中。
假设搜索是区分大小写。
<yourFile.txt repl (null) \n$1\n ax | find /c "null"
如果你希望搜索不区分大小写
<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"
答案2
您是否可以选择下载单个可执行文件?
您需要的是一个移植良好的grep
实用程序。
例如 grep (GNU grep) 2.16
您想要的选项是-c
或--count
。
根据下面的@dbenham 的评论,实际计算不仅包含“null”的行而且每行包含多个实例的方法是:
grep -o null 要读取的文件.txt | grep -c
答案3
这不是一种非常纯粹的方法。它要求您获得带有 coreutils 和 grep 包的 gnuwin32。
如果有人能够用纯批处理来完成此操作,那么从某种意义上来说,一切都会更好。
但是 grep 和 wc 是 GNU/linux 方式,您可以在 Windows 中执行。
copy con aa <-- 创建 aa 文件。注意它有 3 次 rrr 字符串。
C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
1 file(s) copied.
(grep -o 上的 -o 很重要,因此它不会返回整行。这尤其重要,因为如果 rrr 在一行上出现多次,您不希望它只为该行显示一次 rrr。grep -o 在新行上获取每个出现的 rrr。总行数就是总出现次数)
C:\blah>grep -o rrr a.a
rrr
rrr
rrr
C:\blah>grep -o rrr a.a | wc -l
3
C:\blah>