使用Bash计算字符串中char的出现次数

Jer*_*cob 106 bash shell sh

我需要使用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)

  • 使用第一个,应该总是避免产生另一个进程来执行这样的工作,当使用大型迭代循环时,它会严重影响性能.通常,在使用迭代或重复操作时,外部流程执行应该是最后的手段. (4认同)
  • [这里还有更多技巧](http://www.cyberciti.biz/faq/unix-linux-appleosx-bsd-bash-count-characters-variables/) 就像 `y="${x//[^s| S]}”;回显“${#y}”` (2认同)
  • @bgStack15 代码块 1 不会启动额外的过程,如果您有大量的行需要解析,则可能具有更好的性能。 (2认同)

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)

  • @Amir你期待什么? (13认同)
  • @andsens`grep -c`只输出匹配行数.它不计算每行多个匹配项. (7认同)
  • @HattrickNZ然后使用:`$(grep -o"$ needle"<filename | wc -l)` (5认同)
  • 你可以跳过`wc -l`,只需使用`grep -c`,它可以在bsd grep和linux grep上运行. (2认同)

Rob*_*Hsu 57

您可以通过组合trwc命令来完成.例如,要计入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,甚至认为文件可能包含许多行.

  • 您的解决方案似乎是最干净,最容易记住的,谢谢! (3认同)

小智 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)


rma*_*nna 5

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

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