计算字符串中模式的出现次数(仅限bash builtins)

时间:2013-01-25 01:31:27

标签: bash built-in

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

STRING="$PATTERN_some-stuff_$PATTERN_some-other_stuff"

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

到目前为止,我发现更简单的方法是从字符串中仅提取匹配$PATTERN的字符串,然后计算新的$PATTERN出现次数。以这种方式创建字符串:

expr length "${STRING//[^$PATTERN]}" / ${#PATTERN}

但只有当$PATTERN是单个字符时它才有效。我尝试使用语法${STRING//!(PATTERN)}",如果我理解Bash手册,那么只会排除其余$PATTERN的{​​{1}},但它实际上不输出任何内容。那么,我哪里错了?

2 个答案:

答案 0 :(得分:4)

如果你对内置机构有点灵活,那么这是grep -o的完美情况:

$ STRING='$PATTERN_some-stuff_$PATTERN_some-other_stuff'
$ grep -o '$PATTERN' <<< "$STRING" | wc -l
2

答案 1 :(得分:2)

一个选项是替换STRING中的所有PATTERN实例,从STRING的长度中减去这个缩短的字符串的长度,然后将其除以PATTERN的长度。顺便说一下,你使用expr蔑视了你的bash内置要求。 expr是一个命令(至少在我的Ubuntu服务器上)

$ declare -- PATTERN="abracadabra"
$ declare -- STRING="${PATTERN}_some-stuff_${PATTERN}_some-other_stuff"
$ echo $STRING
abracadabra_some-stuff_abracadabra_some-other_stuff
$ temp=${STRING//$PATTERN}
$ string_length_without_patterns=${#temp}
$ total_pattern_length=$((${#STRING} - $string_length_without_patterns))
$ number_of_patterns=$(($total_pattern_length/${#PATTERN}))
$ echo $number_of_patterns
2