bash - d=${c//[^$b]} 如何统计字母$b在$c中出现了多少次?

标签 bash shell

#!/bin/bash

echo "The program checks the number of indicated letters"
echo "Enter the file name and path"
read a
c=$(cat $a)
echo "
Enter which letter is to be found. for examle 'a' "
read b
d=${c//[^$b]}
echo "The number of occurrences of the character is: " ${#d}

我无法理解这一行是如何工作的:d=${c//[^$b]}。该程序工作正常,我只是不明白表达式 [^$b] 是如何工作的。我读到表达式 [^...] 匹配任何不在括号中的字符。

例如,如果用户输入字符“a”,他将查找该字母在指示文件中出现的次数。有人可以帮我解释一下这是如何工作的,因为定义 [^...] 说的是完全不同的东西。

我找到了这样一个定义: "[^d]" 匹配除 b 到 d 范围内的任何字符。 因此,如果文件中存在包含句子的字符串,并且不应该像这样显示它们,除非我误解了某些内容。

最佳答案

${s//x}删除变量 s 值中出现的所有 x[x] 将匹配列表中的任何字符(列表仅包含单个字符,因此仅匹配“x”)。 [^x] 匹配除“x”之外的所有字符。

因此,${a//[^x]} 只会在值中保留“x”字符。 ${#v} 给出变量中的字符数。由于变量中只剩下“x”个字符,因此您可以得到这些字符的数量。

也可以通过调用外部程序来实现相同的目的,而不仅仅是依赖 bash 变量扩展(IMO 更简单,更清楚地表达意图):

echo "The number of occurrences of the character is: $(grep -oe "[$b]" "$a" | wc -l)"

关于bash - d=${c//[^$b]} 如何统计字母$b在$c中出现了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72577023/

相关文章:

java - 编译依赖于jar的打包项目

linux - 使用 mailx 和 uuencode 发送附件

linux - 如何使 Git-bash 命令行从主目录启动?

linux - 检查是否存在文件名包含空格的文件

shell - $ 和 ${} 之间的 ksh 差异

bash - 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

bash - 十六进制格式的每行一个字节的输出文件(在 linux bash 下)

bash - 在 unix 中创建一个串联文件,然后在同一个脚本中将该文件邮寄给大家

Bash 脚本,检查错误,日志记录

linux - 递归比较两个目录,使用shell脚本将目录内容复制到第三个目录