在 Windows 中,有没有办法计算某个字符串在文件中出现的次数

在 Windows 中,有没有办法计算某个字符串在文件中出现的次数

我目前正在尝试编写一个批处理脚本,此时,我需要找到一个字符串“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>

相关内容