Eu quero pegar várias linhas em um arquivo com um padrão que tenha uma tag inicial e uma final de forma imprópria.
Por exemplo, eu tenho a seguinte entrada:
arquivo.txt
START
test1
test2
foo
END
some
more text
START
test3
bar
test4
test5
END
even more
START
baz
test6
END
Agora eu quero procurar por bar e imprimir tudo entre START e END , para que eu tenha:
START
test3
bar
test4
test5
END
O que eu tenho até agora é o seguinte comando grep:
grep -Pzo '(?s)START.*?bar.*?END' file.txt
O problema é que essa expressão é gananciosa e imprime:
START # starts at first "START"-tag, not the next one
test1 #
test2 #
foo #
END #
some #
more text #
START
test3
bar
test4
test5
END
Não é feito com o grep flags - antes do contexto / - after-context , porque a contagem de linhas antes e depois pode ser diferente.
A ferramenta usada pelo processamento de texto não importa. Deve funcionar em um sistema geral da RedHat. Além disso, quanto mais rápido a ferramenta agarra as linhas, melhor será. Porque eu tenho grandes arquivos de log de aproximadamente 150MB.
Alguém pode me dizer como alcançar meu objetivo da melhor maneira?
Atualização:
Ok, eu entendi. Eu só tive que pensar em como construir meu comando a partir do link don_crissti
s. Aqui está a solução:
ed -s file.txt <<< $'g/bar/?START?,/END/p\nq\n'
Muito obrigado por toda sua ajuda muito rápida!
E sim, finalmente é uma duplicata ...