计算字符串中某个模式出现的次数(仅限 bash 内置函数)

mic*_*yer 2 bash built-in

我有一个看起来像这样的字符串:

STRING="$PATTERN_some-stuff_$PATTERN_some-other_stuff"
Run Code Online (Sandbox Code Playgroud)

我想仅使用 Bash 内置命令来计算其中出现的次数$PATTERN

到目前为止,我发现的更直接的方法是从字符串中仅提取匹配的字符串$PATTERN,然后计算$PATTERN新创建的字符串中出现了多少次,按以下方式进行:

expr length "${STRING//[^$PATTERN]}" / ${#PATTERN}
Run Code Online (Sandbox Code Playgroud)

但它仅适用于$PATTERN单个字符。我尝试使用语法${STRING//!(PATTERN)}",如果我很好地理解 Bash 手册,它只会匹配$PATTERN排除其余部分的情况$STRING,但它实际上什么也不输出。那么,我哪里错了?

gle*_*man 6

如果您只对内置函数有点灵活,那么这是一个完美的情况grep -o

$ STRING='$PATTERN_some-stuff_$PATTERN_some-other_stuff'
$ grep -o '$PATTERN' <<< "$STRING" | wc -l
2
Run Code Online (Sandbox Code Playgroud)