Bash
計算字元串中子字元串出現的次數
如何使用 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}))"
即
$s
contains$STRING
,其中所有出現的$SUB_STRING
都被刪除。$SUB_STRING
我們通過計算 和 之間的字元數之差並除以自身的長度來找出被刪除$STRING
的$s
s$SUB_STRING
的數量。POSIXly,您可以執行以下操作:
s=$STRING count=0 until t=${s#*"$SUB_STRING"} [ "$t" = "$s" ] do count=$((count + 1)) s=$t done echo "$count"