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


Answers:


117

我将使用以下awk命令:

string="text,text,text,text"
char=","
awk -F"${char}" '{print NF-1}' <<< "${string}"

我将字符串分割,$char并打印结果字段的数量减去1。

如果您的外壳不支持该<<<运算符,请使用echo

echo "${string}" | awk -F"${char}" '{print NF-1}'

5
@HattrickNZ然后使用:$(grep -o "$needle" < filename | wc -l)
hek2mgl 2014年

13
@Amir您期望什么?
hek2mgl 2014年

3
您可以跳过wc -l,只需使用grep -c,它就可以同时在bsd grep和linux grep上使用。
andsens

8
@andsens grep -c将仅输出匹配的行数。它不计算每行多个匹配项。
hek2mgl

1
我想计算字符串中的“ $”,如何从主字符串中转义“ $”?
MasT

117

例如,您可以删除所有其他字符并计算剩余的内容,例如:

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"

1
一些技巧在这里y="${x//[^s|S]}"; echo "${#y}"
水瓶座电源

4
使用第一个方法时,应始终避免诉诸于生成另一个进程来完成这样的工作,当使用较大的迭代循环时,这可能会严重影响性能。通常,在使用迭代或重复操作时,外部流程执行应该是最后的选择。
osirisgothra 2014年

你为什么不喜欢wc?打高尔夫球!
西罗Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli六四事件法轮功包卓轩echo -n some line | wc -l
jm666

我认为代码块4是最好的。我们需要更轻松地到达:tr -dc ',' <<<"$var" | wc -c
bgStack15 '16

68

您可以通过组合trwc命令来实现。例如,要计算e字符串 referee

echo "referee" | tr -cd 'e' | wc -c

输出

4

说明:Command tr -cd 'e'删除除'e'以外的所有字符,并且Command wc -c计算剩余的字符。

多行输入也适用于此解决方案,例如命令cat mytext.txt | tr -cd 'e' | wc -c可以e在文件中计数mytext.txt,甚至认为文件可能包含多行。


3
您的解决方案似乎是最干净,最容易记住的,谢谢!
jirislav

这很棒。谢谢!
Kodie Grantham

我喜欢这个,因为我讨厌awk!
franzisk

3

基于每个人的出色答案和评论,这是最短最甜的版本:

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


2

如果您的服务器安装了awk,效果很好

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}')
echo "${num}"

请注意:awk -F,寻找,。您可以执行以下操作:awk -F"${your_char}"
Emixam19年

1

我建议以下内容:

var="any given string"
N=${#var}
G=${var//g/}
G=${#G}
(( G = N - G ))
echo "$G"

无需调用任何其他程序


1

还要检查一下,例如我们想计数 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.