我需要使用 Bash计算字符串中 char 的出现次数。
在下面的例子中,当 char 是 (for example)t
时,它是inecho
的正确出现次数,但是当字符是逗号或分号时,它打印出零:t
var
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
例如,您可以删除所有其他字符并计算剩余的内容,例如:
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"
我会使用以下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}'
您可以通过组合tr
和wc
命令来做到这一点。例如,e
在字符串 中计数referee
echo "referee" | tr -cd 'e' | wc -c
输出
4
说明:Commandtr -cd 'e'
删除除 'e' 以外的所有字符,Commandwc -c
计算剩余字符。
多行输入也适用于此解决方案,例如命令可以在文件cat mytext.txt | tr -cd 'e' | wc -c
中计数,即使文件可能包含很多行。e
mytext.txt
*** 更新 ***
要解决数字 (@tom10271) 中的多个空格,只需附加一个管道 tr 命令:
tr -d ' '
例如:
echo "referee" | tr -cd 'e' | wc -c | tr -d ' '
基于每个人的精彩回答和评论,这是最短和最甜蜜的版本:
grep -o "$needle" <<< "$haystack" | wc -l
awk 很酷,但为什么不保持简单呢?
num=$(echo $var | grep -o "," | wc -l)
如果你的服务器有 awk 就可以正常工作
var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
我建议如下:
var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"
不调用任何其他程序
也检查一下,例如我们想数数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
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
。