[英]awk/sed: add a count of the occurrences of a match string to a file
所以我有一个文件,并且有一个字符串,我想通过在它上面放一条标记线来突出显示。 我可以用 sed 轻松地做到这一点:
cat flog.txt |sed '/foo/ i===========B' >t.lis
这工作正常,因为我现在有一个看起来像这样的文件
===========B blablabla foo blabla bla bla bla bla ===========B blablabla foo blabla bla bla bla bla bla bla bla ===========B blablabla foo blabla bla bla bla bla ===========B blablabla foo blabla bla bla bla bla
但是我希望 "==========B" 行有一个计数 1、2、3 等,所以文件看起来像这样:
===========B 1 blablabla foo blabla bla bla bla bla ===========B 2 blablabla foo blabla bla bla bla bla bla bla bla ===========B 3 blablabla foo blabla bla bla bla bla ===========B 4 blablabla foo blabla bla bla bla bla
等等,有人可以帮忙吗?
谢谢,
这个awk
应该可以完成这项工作:
awk '/foo/{ print "===========B " ++i } 1' file
取决于你想要什么样的比赛:
部分正则表达式匹配:
awk '/foo/{ print "===========B", ++i } 1' file
与 POSIX awk 的完整正则表达式匹配:
awk '(" "$0" ") ~ /[[:space:]]foo[[:space:]]/{ print "===========B", ++i } 1' file
与 GNU awk 的完整正则表达式匹配:
awk '/\<foo\>/{ print "===========B", ++i } 1' file
部分字符串匹配:
awk 'index($0,"foo"){ print "===========B", ++i } 1' file
全字符串匹配:
awk 'index(" "$0" ","[[:space:]]foo[[:space:]]"){ print "===========B", ++i } 1' file
不处理多个匹配,但将标记与匹配的标记对齐
$ awk 'match($0,"foo"){m=sprintf("%*s",RSTART," "); gsub(" ","=",m); print m"B "++c}1' file
==============================B 1
asfa lkja ldfkjal jlajsd lja foo
=========B 2
asdf af foo afa sdf foo asdfasdf
=================B 3
asdfad asdfasdf foo
这可能对您有用(GNU sed 和 bash):
sed -E '/foo/{x;s/.*/expr & + 1/e;x;G;s/^(.*)\n(.*)/============B \2\n\1/}' file
在货舱里放一个柜台。 每次匹配时递增计数器,将计数器附加到当前匹配行并使用模式匹配,重新排列为所需的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.