2

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

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

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

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

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

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

4

2 回答 2

4

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

$ STRING='$PATTERN_some-stuff_$PATTERN_some-other_stuff'
$ grep -o '$PATTERN' <<< "$STRING" | wc -l
2
于 2013-01-25T18:43:20.617 回答
2

一种选择是替换 STRING 中的所有 PATTERN 实例,从 STRING 的长度中减去这个缩短的字符串的长度,然后将其除以 PATTERN 的长度。顺便说一句,您使用expr. 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
于 2013-01-25T01:55:02.503 回答