148

我需要使用 Bash计算字符串中 char 的出现次数。

在下面的例子中,当 char 是 (for example)t时,它是inecho正确出现次数,但是当字符是逗号或分号时,它打印出零:tvar

var = "text,text,text,text" 
num = `expr match $var [,]`
echo "$num"
4

9 回答 9

138

例如,您可以删除所有其他字符并计算剩余的内容,例如:

var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"

将打印

,,,
3

或者

tr -dc ',' <<<"$var" | awk '{ print length; }'

或者

tr -dc ',' <<<"$var" | wc -c    #works, but i don't like wc.. ;)

或者

awk -F, '{print NF-1}' <<<"$var"

或者

grep -o ',' <<<"$var" | grep -c .

或者

perl -nle 'print s/,//g' <<<"$var"
于 2013-05-21T21:19:02.790 回答
125

我会使用以下awk命令:

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

我将字符串拆分$char并打印结果字段的数量减去 1。

如果您的 shell 不支持<<<运算符,请使用echo

echo "${string}" | awk -F"${char}" '{print NF-1}'
于 2013-05-21T21:05:01.207 回答
91

您可以通过组合trwc命令来做到这一点。例如,e在字符串 中计数referee

echo "referee" | tr -cd 'e' | wc -c

输出

4

说明:Commandtr -cd 'e'删除除 'e' 以外的所有字符,Commandwc -c计算剩余字符。

多行输入也适用于此解决方案,例如命令可以在文件cat mytext.txt | tr -cd 'e' | wc -c中计数,即使文件可能包含很多行。emytext.txt

*** 更新 ***

要解决数字 (@tom10271) 中的多个空格,只需附加一个管道 tr 命令:

 tr -d ' '

例如:

echo "referee" | tr -cd 'e' | wc -c | tr -d ' '
于 2016-12-13T10:49:08.210 回答
6

基于每个人的精彩回答和评论,这是最短和最甜蜜的版本:

grep -o "$needle" <<< "$haystack" | wc -l

于 2019-05-13T10:10:54.477 回答
4

awk 很酷,但为什么不保持简单呢?

num=$(echo $var | grep -o "," | wc -l)
于 2021-02-26T16:21:22.733 回答
2

如果你的服务器有 awk 就可以正常工作

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
于 2014-06-02T17:15:20.117 回答
1

我建议如下:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

不调用任何其他程序

于 2019-01-24T04:00:50.003 回答
1

也检查一下,例如我们想数数t

echo "test" | awk -v RS='t' 'END{print NR-1}'

或在python

python -c 'print "this is for test".count("t")'

甚至更好,我们可以使我们的脚本动态awk

echo 'test' | awk '{for (i=1 ; i<=NF ; i++) array[$i]++ } END{ for (char in array) print char,array[char]}' FS=""

在这种情况下,输出是这样的:

e 1
s 1
t 2
于 2020-02-19T17:34:00.087 回答
0

awk如果您的文本中有换行符,到目前为止此处提供的解决方案都会中断。例如:

text="one,two,thr
ee,four"
DELIM=','
count=$( awk -F"$DELIM" '{print NF-1}' <<<"${text}" )
echo $count

结果:

2
1

也可以与换行符一起正常工作的解决方案是:

text="one,two,thr
ee,four"
DELIM=','
count=$( awk 'BEGIN{RS="'"$DELIM"'";FS=""}END{print NR-1}' <<<"${text}" )
echo $count

结果是3

于 2022-02-06T03:01:40.867 回答