2

私はこのような文字列を持っています:

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

$PATTERNBashの組み込みコマンドのみを使用して、その中の発生数をカウントしたいと思います。

これを行うためのより簡単な方法は、文字列から一致する文字列のみを抽出し、$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

1つのオプションは、STRING内のPATTERNのすべてのインスタンスを置き換え、STRINGの長さからこの短縮された文字列の長さを減算してから、これをPATTERNの長さで除算することです。ちなみに、を使用してbashの組み込み要件を無視しましたexprexprコマンドです(少なくとも私の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 に答える