计算字符串在Windows中的文件中出现的次数

时间:2014-09-19 18:26:46

标签: windows cmd find findstr

我尝试使用以下命令来计算字符串在大文件中出现的次数。 (几个演出),但它只返回字符串出现的行数。这对我来说是有问题的,因为字符串每行出现多次。

无论如何计算字符串在CMD文件中出现的次数还是需要批处理文件?

find /c "findthis9=""7""" *.xml > results.txt

3 个答案:

答案 0 :(得分:1)

如果您有一个可以在每次出现搜索字符串之前和之后插入换行符的实用程序,则可以在批处理(或命令行)中轻松完成。 REPL.BAT hybrid JScript/batch utility可以很容易地做到这一点。 REPL.BAT是纯脚本,可​​以在任何现代Windows机器上从XP开始本地运行。它在stdin上执行正则表达式搜索/替换,并将结果写入stdout。

<test.xml repl "(findthis9=\q7\q)" \n$1\n x | find /c "findthis9=""7"""

答案 1 :(得分:0)

我认为不可能。如果你以后的窗口,你可以从命令行调用powershell:

powershell -Command "&{(Get-Content c:\test.xml) | Foreach-Object {([regex]::matches( $_, 'findthis9=\"7\"'))} | Measure-Object | select -expand Count}

只是澄清:除了直接从cmd运行之外,它还会给你字符串的数量findthis9 =&#34; 7&#34;在文件test.xml中。

对于文件中的每一行,匹配findthis9 =&#34; 7&#34;,测量(计数)结果,仅显示实际出现次数。

答案 2 :(得分:0)

如果您使用的是Windows XP或更高版本,理论上您可以使用Windows PowerShell。如果系统是Windows Vista,那么你绝对可以。如果它确实是XP,那么您需要确保首先安装PowerShell。这是代码:

# Windows PowerShell
# All text following a '#' is a comment line, like the 'rem' keyword in cmd
$file = Get-Content MyFile.xml # you can change this to *.xml if you wish

# split the file variable on all instances of a space
$file = $file.Split(" ")

# declare the pattern
$pattern = "findthis9=""7"""
# declare a variable to use as a counter for each occurence

for ($i = 0; $i -lt $file.GetUpperBound(""); $i++)
{
    if ($file[$i] -match $pattern)
    {
        ++$counterVariable
    }
}

return $counterVariable

此外,如果您将其转换为函数,则可以按文件执行此操作,因为您可以使用文件中出现的次数返回文件名。见下文:

function Count-NumberOfStringInstances()
{
    [CmdletBinding()]

    # define the parameters
    param (

    # system.string[] means array, and will allow you to enter a list of strings
    [Parameter()]
    [System.String[]]$FilePath,

    [Parameter()]
    [System.String]$TextPattern
    )

    $counterVariable = 0

    $files = Get-ChildItem -Path $FilePath

        $file = Get-Content $FilePath # you can change this to *.xml if you wish

        # split the file variable on all instances of a space
        $file = $file.Split(" ")

        # declare the pattern
        # declare a variable to use as a counter for each occurence

        for ($i = 0; $i -lt $file.GetUpperBound(""); $i++)
        {
            if ($file[$i] -match $TextPattern)
            {
                ++$counterVariable
            }
        }

        # return the counter variable

    return $counterVariable
}