如何使用 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
:独自一人,
bash
你总是可以做类似的事情:即
$s
contains$STRING
,其中所有出现的$SUB_STRING
都被删除。$SUB_STRING
我们通过计算 和 之间的字符数的差异并除以自身的长度来找出被删除$STRING
的$s
s$SUB_STRING
的数量。POSIXly,您可以执行以下操作:
使用字符串处理函数,我们可以使用 Perl 进行如下操作:
解释:
下面列出了一些其他方法:
啜饮字符串并使用正则表达式。
° 将字符串插入 $_ 变量中。
° 使用 -s 选项将子字符串从命令行传递给 perl。
° 现在在 $_ 上执行匹配,并在列表上下文中为您获取匹配项,然后在标量上下文中获取匹配项的数量。
° -p 选项将自动打印 $_ 中的内容。
使用 sed 工具的方法:
° 作为准备步骤,我们继续将所有充当元字符的字符转义到子字符串中 s/// 语句的左侧,如果不这样做将导致 sed 崩溃。
° 现在我们将整个字符串吞入模式空间。
° 然后我们继续打印一个空行,保持空间是一个很好的候选,并从模式空间中取出子字符串。
° 冲洗……泡沫……只要存在子串就重复。
° 然后将空行通过管道传输到 wc 工具,该工具将为我们提供行数 = 找到子字符串的次数。
这是外壳版本:
如果子字符串不包含换行符:
你可以在这个问题中使用 Python
或者,如果您正在使用 shell 变量:
在你的情况下:
解释
RS
- 输入记录分隔符,默认为换行符。将其设置为所需的字符串,awk
并将所有文本拆分为记录,使用此字符串作为分隔符。然后,它只剩下打印节中减去的记录1
数END
。使用变量:
如果你有 gnugrep,你可以运行一些类似的东西
grep -zPio 'Bluetooth\s+Soft blocked: no\s+Hard blocked: no' ex.txt | grep -zc .