Bash

計算字元串中子字元串出現的次數

  • February 23, 2021

如何使用 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

**注意 I:**我已經嘗試了幾種使用 sed、grep、awk 的方法……當我們有帶空格和多行的字元串時,似乎沒有任何效果。

**注意 II:**我是 Linux 使用者,我正在嘗試一種解決方案,該解決方案不涉及安裝通常在 Linux 發行版中找到的應用程序/工具之外的應用程序/工具。


重要的:

我想要類似下面的假設範例。在這種情況下,我們使用兩個Shell 變數 (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 只是為了說明!

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}))"

$scontains $STRING,其中所有出現的$SUB_STRING都被刪除。$SUB_STRING我們通過計算 和 之間的字元數之差並除以自身的長度來找出被刪除$STRING$ss$SUB_STRING的數量。

POSIXly,您可以執行以下操作:

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

引用自:https://unix.stackexchange.com/questions/442349