com sed
:
sed -n '/^Via:/{ x; /keyword/p; d; }; /keyword/H; ${ x; /keyword/p; }' input.txt
Ou, se você quiser keyword
ancorado no início da linha:
sed -n '/^Via:/{ x; /\nkeyword/p; d; }; /^keyword/H; ${ x; /\nkeyword/p; }' input.txt
Dado intput:
Via: 1.1.1.1
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 2.2.2.2
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 3.3.3.3
not relevant lines
Via: 4.4.4.4
not relevant
Via: 5.5.5.5
not relevant line
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
not relevant line N
...
Resultado exigido:
Via: 1.1.1.1
keyword + some text A
keyword + some text A
Via: 2.2.2.2
keyword + some text B
keyword + some text C
Via: 5.5.5.5
keyword + some text D
keyword + some text E
A string de palavra-chave pode ocorrer N vezes em qualquer bloco Via ou pode não ocorrer. Na saída, preciso apenas dos blocos Via, em que a palavra-chave ocorre junto com as sequências de palavras-chave que pertencem a elas. A resposta mais próxima que encontrei é aqui , mas não consigo fazer o que preciso.
Awk :
awk '/^Via:/{ f=1; r=$0; kw=0; next }
f && /keyword/{ printf "%s%s\n",(!kw)? r ORS:"",$0; kw++ }' file
/^Via:/
- captura da linha que começa com Via:
na variável r
. Defina o sinalizador f=1
no estado "ativo" indicando o processamento de um determinado Via
block
kw
- sinalizador denotando o número de "palavra-chave" linhas sob cada Via
bloco
f && /keyword/
- durante o processamento de linhas em Via
block - considere apenas as linhas que correspondem a keyword
pattern
Tags grep text-processing awk sed