对于同一行上的多个实例,使用grep重复整行匹配

这个问题的一个分支:

在从以下文件中搜索字符串“banana”时,我们分别想要1,2,3和7行的1,2,3和7个实例。 grep输出的数量应该等于匹配实例的数量,同时仍然返回整行。

There is one banana here There are two banana banana here There are three banana banana banana here Basically there is no limit to how many banana banana banana banana banana banana banana we can have In fact we need not have any too! 

注意:如果我们删除输出中整行的限制,我们有:

 grep -no "banana" tempfile 

返回

 1:banana 2:banana 2:banana 3:banana 3:banana 3:banana 4:banana 4:banana 4:banana 4:banana 4:banana 4:banana 4:banana 

有任何想法吗?

编辑:这是预期的输出

 1 There is one banana here 2 There are two banana banana here 2 There are two banana banana here 3 There are three banana banana banana here 3 There are three banana banana banana here 3 There are three banana banana banana here 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 

grep没有匹配的计数器,只有-c计数器用于匹配的行,但是我们可以使用awk来做到这一点。 据我了解,您希望根据匹配量打印匹配x次的行。 好吧,这是:

 $ awk '{for(i=1;i<=NF;i++) if($i=="banana") counter++;for(j=1;j<=counter;j++) print NR,$0;counter=0 }' input.txt 1 There is one banana here 2 There are two banana banana here 2 There are two banana banana here 3 There are three banana banana banana here 3 There are three banana banana banana here 3 There are three banana banana banana here 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 4 Basically there is no limit to how many banana banana banana banana banana banana banana we can have 

这里的基本思想是我们在一行中循环每个单词,并计算匹配。 如果匹配,我们增加计数器,然后使用该计数器在循环中打印相同的行。 最后重置计数器并重复处理

使用perl字符串重复运算符,通过在标量上下文中评估匹配结果来获取重复次数:

 $ perl -pe '$_ x= (() = /banana/g)' file There is one banana here There are two banana banana here There are two banana banana here There are three banana banana banana here There are three banana banana banana here There are three banana banana banana here Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have Basically there is no limit to how many banana banana banana banana banana banana banana we can have 

它不是很漂亮,但你可以使用类似的东西

 awk '{print NR, gsub(/banana/, "")'  

它的工作原理是使用awk gsub命令替换匹配模式(此处为banana),并返回执行替换的次数。 如果然后输出输入行号和匹配数

或者多次重复输入行

 awk '{A=$0 b=gsub(/banana/, "") for (i=1; i<=b; i++) print A }'