我需要使用 Bash 计算 字符串中字符出现的次数。
在下面的示例中,当字符为(例如)t
时,它
echo
s
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
说明:命令 tr -cd 'e'
删除除 'e' 之外的所有字符,命令
wc -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 ' '
num=$(echo $var | grep -o "," | wc -l)
然后您可以将其重新用作函数:
# usage: echo "1,2,3,4,5" | text.count # outputs 4
function text.count(){
grep -o "$1" | wc -l
}
grep -o "$needle" <<< "$haystack" | wc -l
var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
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
var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"
不调用任何其他程序
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
。
回显“文本,文本,文本,文本”| tr“,”' ' | sed 's/$/,/g' > 文件名
导出计数=$(grep -F $searchpattern 文件名 | wc -l)
回显“$count-1”|公元前