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"