我需要使用Bash计算字符串中某个字符的出现次数。
在下面的示例中,当字符为(例如)t
时,它会正确地输出var
中t
的出现次数,但是当字符为逗号或分号时,它会输出零:
var = "text,text,text,text"
num = `expr match $var [,]`
echo "$num"
我需要使用Bash计算字符串中某个字符的出现次数。
在下面的示例中,当字符为(例如)t
时,它会正确地输出var
中t
的出现次数,但是当字符为逗号或分号时,它会输出零:
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"
tr -dc ',' <<<"$var" | wc -c
- bgStack15wc
在输入时错误地计算了行数。当然,wc -c
是可以的,但由于行计数问题,我不喜欢它。例如,printf "line1\nline2\n" | wc -l
打印出2
,但printf "line1\nline2" | wc -l
只打印出1
。 - clt60我会使用以下的 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}'
$(grep -o "$needle" < filename | wc -l)
。该命令可以在文件中查找指定的字符串并统计出现次数。 - hek2mglwc -l
,直接使用grep -c
пјЊе®ѓйЂ‚з”ЁдєЋBSD grepе’ЊLinux grepгЂ‚ - andsensgrep -c
只会输出匹配行的数量,不计算每行中多个匹配项的次数。 - hek2mgltr
和 wc
命令来完成。例如,要在字符串 referee
中计算字母 e
的数量。echo "referee" | tr -cd 'e' | wc -c
输出
4
说明:命令tr -cd 'e'
会去除除了'e'以外的所有字符,而命令wc -c
会计算剩余字符的数量。
对于这个解决方案来说,多行输入也是可以的,比如命令cat mytext.txt | tr -cd 'e' | wc -c
可以统计文件mytext.txt
中的e
数量,即使文件中可能包含很多行。
*** 更新 ***
为了解决数字前面的多个空格(@tom10271),只需添加一个管道后跟tr命令:
tr -d ' '
例如:echo "referee" | tr -cd 'e' | wc -c | tr -d ' '
tr
,它似乎是一个我不知道的很棒的工具。今天我学到了新东西! - j.cnum=$(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
如果您的服务器已经安装了awk,那么它将可以很好地工作。
var="text,text,text,text"
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"
awk -F,
查找逗号。你可以这样做:awk -F"${your_char}"
。 - Emixam23t
。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
。
export searchpattern=$(echo ",")
echo "text,text,text,text" | tr "," '\n' | sed 's/$/,/g' > filename
export count=$(grep -F $searchpattern filename | wc -l)
echo "$count-1" | bc