我正在尝试获取.tex 文件每行的匹配项数量(在本例中为{
或的出现次数)。}
我知道-o
标志只返回匹配项,但它会在新行上返回每个匹配项,即使与标志结合也是如此-n
。我不知道我可以通过什么管道来计算重复次数。标志-c
只返回整个文件中的匹配项总数 - 也许我可以一次将一行管道传输到 grep?
答案1
grep -o -n '[{}]' <filename> | cut -d : -f 1 | uniq -c
输出结果如下:
3 1
1 2
意思是第一行出现 3 次,第二行出现 1 次。
答案2
阅读了各种解决方案后,我认为这是解决问题最简单的方法:
while read i; do echo $i |grep -o "matchingString"| wc -l; done < input.txt
答案3
使用是grep
必需的吗?这里有一个替代方案:
sed's/[^{}]//g'你的文件| awk'{打印 NR,长度}'
删除sed
除 和 之外的所有字符{
(}
即,仅保留{
和}
字符),然后awk
计算每行上的字符(仅是{
和}
字符)。要抑制没有匹配的行,
sed's/[^{}]//g'你的文件| awk'/./{打印 NR,长度}'
请注意,我的解决方案假设(要求)您要查找的字符串是单个字符。Moebius 的答案更容易适应多字符字符串。此外,我们的答案都不排除感兴趣的字符/字符串的引用或转义出现;例如,
{ "nullfunc() {}" }
将被认为包含四个括号字符。
答案4
使用 awk,您可以搜索字符串的出现次数,显示找到该字符串的次数以及找到该字符串的行号。在这里,我只想查看那些包含搜索字符串多次的行。作为输入,我使用 ls 的手册页。我将搜索字符串(此处为“of”)放在一个变量中。
s='of'; man ls | awk -v s="${s}" '{ if ($0 ~ s) { k = split($0, ar, s); if (k > 2) { print NR, k-1, $0 }}}' | grep "${s}"
输出:
32 2 -c with -lt: sort by, and show, ctime (time of last modification of file status information); with -l: show ctime and sort by name; otherwise: sort by ctime, newest first
180 2 The SIZE argument is an integer and optional unit (example: 10K is 10*1024). Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000). Binary prefixes can be used, too: KiB=K,
grep 语句用于为搜索字符串着色(此处不可见)。