我需要使用Bash计算字符串中char的出现次数.
在下面的示例中,当char是(例如)时t,它echo是正确的tin 的出现次数var,但是当字符是逗号或分号时,它打印出零:
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
Run Code Online (Sandbox Code Playgroud)
jm6*_*666 104
你可以删除所有其他字符并计算剩下的数字,例如:
var="text,text,text,text"
res="${var//[^,]}"
echo "$res"
echo "${#res}"
Run Code Online (Sandbox Code Playgroud)
将打印
,,,
3
Run Code Online (Sandbox Code Playgroud)
要么
tr -dc ',' <<<"$var" | awk '{ print length; }'
Run Code Online (Sandbox Code Playgroud)
要么
tr -dc ',' <<<"$var" | wc -c #works, but i don't like wc.. ;)
Run Code Online (Sandbox Code Playgroud)
要么
awk -F, '{print NF-1}' <<<"$var"
Run Code Online (Sandbox Code Playgroud)
要么
grep -o ',' <<<"$var" | grep -c .
Run Code Online (Sandbox Code Playgroud)
要么
perl -nle 'print s/,//g' <<<"$var"
Run Code Online (Sandbox Code Playgroud)
hek*_*mgl 101
我会使用以下awk命令:
string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"
Run Code Online (Sandbox Code Playgroud)
我正在拆分字符串$char并打印结果字段数减1.
如果您的shell不支持<<<运算符,请使用echo:
echo "${string}" | awk -F"${char}" '{print NF-1}'
Run Code Online (Sandbox Code Playgroud)
Rob*_*Hsu 57
您可以通过组合tr和wc命令来完成.例如,要计入e字符串 referee
echo "referee" | tr -cd 'e' | wc -c
Run Code Online (Sandbox Code Playgroud)
产量
4
Run Code Online (Sandbox Code Playgroud)
说明:命令tr -cd 'e'删除除"e"以外的所有字符,Command会wc -c计算剩余的字符.
多行输入也适用于此解决方案,例如命令cat mytext.txt | tr -cd 'e' | wc -c可以e在文件中计数mytext.txt,甚至认为文件可能包含许多行.
小智 15
awk 很酷,但为什么不保持简单呢?
num=$(echo $var | grep -o "," | wc -l)
Run Code Online (Sandbox Code Playgroud)
然后您可以将其重新用作函数:
# usage: echo "1,2,3,4,5" | text.count # outputs 4
function text.count(){
grep -o "$1" | wc -l
}
Run Code Online (Sandbox Code Playgroud)