awk / sed: добавить количество найденных совпадений в файл - PullRequest
0 голосов
/ 04 февраля 2020

поэтому у меня есть файл, и есть строка, которую я хочу выделить, поместив над ней линию маркера. Я могу сделать это достаточно легко с помощью 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 и т. Д. c. поэтому файл выглядит так:

===========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

и так далее, кто-нибудь может помочь?

спасибо,

Ответы [ 4 ]

4 голосов
/ 04 февраля 2020

Это awk должно выполнить работу:

awk '/foo/{ print "===========B " ++i } 1' file
1 голос
/ 05 февраля 2020

В зависимости от того, какой тип соответствия вы хотите:

Частичное совпадение регулярного выражения:

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
0 голосов
/ 05 февраля 2020

Это может сработать для вас (GNU sed и bash):

sed -E '/foo/{x;s/.*/expr & + 1/e;x;G;s/^(.*)\n(.*)/============B \2\n\1/}' file

Держите счетчик в поле удержания. Увеличивайте счетчик каждый раз, когда происходит совпадение, добавляйте счетчик к текущей строке соответствия и, используя сопоставление с образцом, переставляйте в нужный результат.

0 голосов
/ 04 февраля 2020

Не обрабатывает несколько совпадений, но выравнивает маркер по сопоставленному токену

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...