问题描述
|
我想计算一行上(或所有行的匹配数,因为总会只有一行)。
我想不仅仅算每行一场比赛
echo \"123 123 123\" | grep -c -E \"123\" # Result: 1
更好的例子:
echo \"1 1 2 2 2 5\" | grep -c -E \'([^ ])( \\1){1}\' # Result: 1,expected: 2 or 3
解决方法
您可以使用
grep -o
,然后通过wc -l
进行管道传输:
$ echo \"123 123 123\" | grep -o 123 | wc -l
3
, 也许您应该先将空格转换为换行符:
$ echo \"1 1 2 2 2 5\" | tr \' \' $\'\\n\' | grep -c 2
3
, 也许在下面:
echo \"123 123 123\" | sed \"s/123 /123\\n/g\" | wc -l
(也许很丑,但是我的bash fu并不是很好)
, 为什么不使用awk?
你可以用awk \'{print gsub(your_regex,\"&\")}\'
在每行上打印匹配数,或者
awk \'{c+=gsub(your_regex,\"&\")}END{print c}\'
打印匹配总数。请注意,相对速度可能会有所不同,具体取决于使用哪种awk实现以及给出的输入。
, 这可能对您有用:
sed -n -e \':a\' -e \'s/123//p\' -e \'ta\' file | sed -n \'$=\'
GNU sed可以写成:
sed -n \':;s/123//p;t\' file | sed -n \'$=\'