簡體   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