我有一个看起来像这样的字符串:
STRING="$PATTERN_some-stuff_$PATTERN_some-other_stuff"
我想计算其中$PATTERN
的出现次数,仅使用Bash内置命令。
到目前为止,我发现更简单的方法是从字符串中仅提取匹配$PATTERN
的字符串,然后计算新的$PATTERN
出现次数。以这种方式创建字符串:
expr length "${STRING//[^$PATTERN]}" / ${#PATTERN}
但只有当$PATTERN
是单个字符时它才有效。我尝试使用语法${STRING//!(PATTERN)}"
,如果我理解Bash手册,那么只会排除其余$PATTERN
的{{1}},但它实际上不输出任何内容。那么,我哪里错了?
答案 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