繁体   English   中英

awk/sed:将匹配字符串出现的次数添加到文件中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM