1

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

Hey . My . Name . Is . Bash

用字符“。” 应该返回:4

我们被告知 grep 会很有用,但找不到一个好方法来做到这一点。

谢谢

4

5 回答 5

1

有很多方法。

像这样的例子:

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

或使用双 grep:

$ echo "Hey . My . Name . Is . Bash" | grep -o "\."  | grep -c "\."
4
于 2013-05-23T11:32:41.267 回答
1

尝试:

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

纯重击:

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

完后还有:

$ tr -C -d [\.] <<< $s | wc -c
4
于 2013-05-23T11:32:43.120 回答
1

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

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

于 2013-05-23T11:33:08.390 回答
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

于 2013-05-23T11:33:59.647 回答
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
于 2013-05-23T11:49:28.920 回答