文字列内の部分文字列の発生回数を計算します。

文字列内の部分文字列の発生回数を計算します。

Bashを使用して文字列内の部分文字列の発生回数を計算するには?

例:

この部分文字列が何回表示されるかを知りたいです。

Bluetooth
         Soft blocked: no
         Hard blocked: no

...この文字列に表示されます...

0: asus-wlan: Wireless LAN
         Soft blocked: no
         Hard blocked: no
1: asus-bluetooth: Bluetooth
         Soft blocked: no
         Hard blocked: no
2: phy0: Wireless LAN
         Soft blocked: no
         Hard blocked: no
113: hci0: Bluetooth
         Soft blocked: no
         Hard blocked: no

注1:sed、grep、awkなどを使ってさまざまな方法を試しました。空白と複数行を含む文字列がある場合は何も機能しないようです。

ノート2:私はLinuxユーザーであり、Linuxディストリビューションで一般的に見られるもの以外のアプリ/ツールをインストールしないソリューションを試しています。


重要:

私は以下の仮想の例のようなものが欲しい。この例では、2つの方法を使用します。シェル変数(Bash)

例:

STRING="0: asus-wlan: Wireless LAN
         Soft blocked: no
         Hard blocked: no
1: asus-bluetooth: Bluetooth
         Soft blocked: no
         Hard blocked: no
2: phy0: Wireless LAN
         Soft blocked: no
         Hard blocked: no
113: hci0: Bluetooth
         Soft blocked: no
         Hard blocked: no"

SUB_STRING="Bluetooth
         Soft blocked: no
         Hard blocked: no"

awk -v RS='\0' 'NR==FNR{str=$0; next} {print gsub(str,"")}' "$STRING" "$SUB_STRING"

メモ:私たちは説明のためだけにawkを使用します!

ベストアンサー1

そしてperl

printf '%s' "$SUB_STRING" |
  perl -l -0777 -ne '
    BEGIN{$sub = <STDIN>}
    @matches = m/\Q$sub\E/g;
    print scalar @matches' <(printf '%s' "$STRING")

一人bashでいつでも次のことができます。

s=${STRING//"$SUB_STRING"}
echo "$(((${#STRING} - ${#s}) / ${#SUB_STRING}))"

つまり、すべての項目が$s削除されるインクルードです。$STRING間の文字の違いを長さで割って計算し、削除された$SUB_STRING数を見つけます。$SUB_STRING$STRING$s$SUB_STRING

POSIXlyでは、次のことができます。

s=$STRING count=0
until
  t=${s#*"$SUB_STRING"}
  [ "$t" = "$s" ]
do
  count=$((count + 1))
  s=$t
done
echo "$count"

おすすめ記事