Grep:计算每行的匹配数


26

我正在尝试获取.tex文件每一行中的匹配数(在这种情况下为{})。

我知道该-o标志仅返回匹配项,但是即使与该-n标志组合,它也会在换行符上返回每个匹配项。我什么都不知道,我可以通过它来计算重复次数。该-c标志仅返回整个文件中的匹配总数-也许我可以一次将一行传递给grep?

Answers:


27
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c

输出将类似于:

3 1
1 2

意思是第一行出现3次,第二行出现1次。

取自/programming//a/15366097/3378354


谢谢-谷歌在SU上找到了很多正则表达式,但在SO上却找不到,它甚至没有正则表达式标签。该sort不作为的grep的输出由行号排序绝对必要的,但我想这是以前很好的做法uniq
克里斯H

2
可能没有标记,regex因为正则表达式是简单的部分。
Tom Zych 2014年

真的有必要sort -n吗?反正不是按行号顺序出来的吗?
Tom Zych 2014年

您说得对,sort -n没有必要。谢谢。
Moebius 2014年

@TomZych,事实证明您是对的,但是我知道我可能没有问过。从grep到tag:regex的想法可能有点过头了。
克里斯H

3

阅读各种解决方案后,我认为这是解决问题的最简单方法:

while read i; do echo $i |grep -o "matchingString"| wc -l;  done < input.txt

3
我认为最好的解决方案。减少一个管道就可以进一步简化:grep -o "matchingString" <<< $i | wc -l
本杰明·W.

1
但是,这将比其他选择慢几个数量级
Rahul

1

使用grep要求吗?这是一个替代方案:

sed's / [^ {}] // g'your_file | awk'{print NR,length}'

sed带出比其他所有的字符{} (即,只留下{}字符),然后awk在每行计数字符(这仅仅是{}字符)。要取消不匹配的行,

sed's / [^ {}] // g'your_file | awk'/./ {打印NR,长度}'

请注意,我的解决方案假定(要求)您要查找的字符串是单个字符。Moebius的答案更容易适应多字符字符串。同样,我们的答案都没有排除感兴趣的字符/字符串的引用或转义出现;例如,

{ "nullfunc() {}" }

将被认为包含四个大括号字符。


grep并不是真正的要求,这只是我开始寻找解决方案的地方,因为它给了我一些帮助。我从来不需要awk,所以如果我没有使用上面的答案,我会以此为契机进行实验-我可能仍然这样做。我未能弄清楚(但不影响任何一个答案)的是,我想每个括号运行一次脚本,以帮助我找出大多数配对在其中出现的不匹配项(在LaTeX源中,用于表格)。一行。
克里斯H

我不太确定“每个括号内运行一次脚本”的含义,但是如果您想查找括号不匹配的情况,则可能要尝试尝试类似的方法sed 's/{[^{}]*}//g' your_file | grep –n '[{}]',在其中sed删除(匹配的)对。如果您有嵌套对,请使用sed 's/{[^{}]*}//g;s/{[^{}]*}//g;s/{[^{}]*}//g;…' …,重复s/{[^{}]*}//g最深嵌套一次。
斯科特(Scott)

我的意思是执行`sed's / [^}] // g'your_file | awk'{print NR,length}'和's / [^ {] // g'your_file | awk'{print NR,length}'。我确实确实有嵌套,并且进行最深层次的工作似乎很麻烦。将很多行变成少数行(在某些情况下,出于正当原因,大括号只能匹配多行)效果很好(我使用jedit突出显示了匹配的括号-对于它理解的任何类型的括号-所以我确实做到了只需缩小范围即可)。
克里斯H
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.