bash - 计算一行中特定字符的数量

时间:2013-05-23 11:30:20

标签: bash grep

想知道如何计算一行中的特定字符。
举个例子:

Hey . My . Name . Is . Bash

使用char“。”应该返回:4

我们被告知grep会很有用,但无法找到一个好方法。

由于

5 个答案:

答案 0 :(得分:1)

有很多方法。

就像这样:

$ echo "Hey . My . Name . Is . Bash" | grep -o "\." | wc -w
4

或双grep:

$ echo "Hey . My . Name . Is . Bash" | grep -o "\."  | grep -c "\."
4

答案 1 :(得分:1)

尝试:

$ echo "Hey . My . Name . Is . Bash" | grep -o '\.' | wc -l
4

Pure bash:

$ s="Hey . My . Name . Is . Bash"
$ m=${s//[^.]/}
$ echo ${#m}
4
另一个:

$ tr -C -d [\.] <<< $s | wc -c
4

答案 2 :(得分:1)

$ echo "Hey . My . Name . Is . Bash" | tr -cd . | wc -m

我相信在这里使用tr会更便宜。

答案 3 :(得分:1)

纯粹的bash:

str="Hey . My . Name . Is . Bash"
len=${#str}
str=${str//./}
len2=${#str}

count=$((len-len2))

echo "There are $count '.' in '$str'"

工作原理:

  • ${#var_name}扩展为变量var_name
  • 的值的长度
  • ${var_name//./}用空字符串
  • 替换.的所有出现

在此尝试:http://ideone.com/SLkLkL

答案 4 :(得分:0)

您无需使用两个流程。

如果你想在一行中计算特殊(单个)字符:

kent$  echo "Hey . My . Name . Is . Bash"|awk '{print split($0,a,".")-1}'
4

或:

kent$  echo "Hey . My . Name . Is . Bash"|awk '{print gsub("\\.","")}'
4