如何计算文件中字符串部分出现的次数

Rod*_*ara 5 command-line bash

我有一个文件,我需要计算文件中输入字符串的所有部分匹配项。
我将向您展示我需要的一个简单示例:

在包含此内容的文件中:

Good-Black-Cat
Bad-Red-Cat
Bad-Gray-Dog
Good-Golden-Dog
Bad-White-Dog
Good-Tabby-Cat
Bad-Siamese-Cat
Run Code Online (Sandbox Code Playgroud)

我需要计算部分字符串“Good -*-Cat”(其中 * 可以是任何东西,没关系)出现的次数。预期输出计数为 2。

任何帮助将不胜感激。

ste*_*ver 12

给定的

$ cat file
Good-Black-Cat
Bad-Red-Cat
Bad-Gray-Dog
Good-Golden-Dog
Bad-White-Dog
Good-Tabby-Cat
Bad-Siamese-Cat
Run Code Online (Sandbox Code Playgroud)

然后

$ grep -c 'Good-.*-Cat' file
2
Run Code Online (Sandbox Code Playgroud)

请注意,这是匹配行计数- 例如,它不适用于每行多次出现,或跨行出现。

或者,与 awk

awk '/Good-.*-Cat/ {n++} END {print n}' file
Run Code Online (Sandbox Code Playgroud)

如果您需要在每行匹配多个可能出现的情况,那么我建议perl

perl -lne '$c += () = /Good-.*?-Cat/g }{ print $c' file
Run Code Online (Sandbox Code Playgroud)

其中/Good-.*?-Cat/g匹配多次( g) 和非贪婪* ( .*?) 并且() =赋值强制匹配在标量上下文中进行评估,因此我们可以将它们添加到计数中。

或者,您可以grep在 perl-comparible 正则表达式 (PCRE) 模式下使用(以便启用非贪婪修饰符),-o只输出匹配的部分 - 然后计算那些wc

grep -Po 'Good-.*?-Cat' file | wc -l
Run Code Online (Sandbox Code Playgroud)

如果您还需要匹配可能跨越行边界的事件,那么您可以perl通过取消设置记录分隔符来做到这一点(注意:这意味着整个文件都被放入内存中)并添加s正则表达式修饰符,例如

perl -0777 -nE '$c += () = /Good-.*?-Cat/gs }{ say $c' file
Run Code Online (Sandbox Code Playgroud)