Eu tenho um arquivo de log ao qual adiciono regularmente novos blocos de texto com a primeira linha como uma tag. Todas as tags começam com +. Não há padrões de terminação nos blocos. Cada bloco pode ser 1 ou várias linhas.
+numbers
23
-87
12
+letters
b
w
a
q
+sentences
line of text
another line of text
+numbers
2
34
+address
line1
line2
line3
+numbers
4
87
Eu quero imprimir todos os blocos que começam com uma determinada tag. Por exemplo, para +números, quero ver:
+numbers
23
-87
12
+numbers
2
34
+numbers
4
87
ou para +endereço:
+address
line1
line2
line3
Eu posso fazer isso com awk. Mas estou procurando uma solução sed.
Você pode fazer isso com um
sed
(isso deve funcionar com qualquer entrada: linhas em branco, blocos consecutivos de+numbers
etc):Como funciona:
Em outras palavras, a linha "tag" é salva no buffer de espera quando
x
é executada e, em seguida, o restante das linhas desse bloco são anexadas quandoH
é executado. Quando a próxima linha "tag" chega ao espaço padrão (ou na última linha), os buffers são trocados novamente, então agora o espaço padrão contém um bloco inteiro de linhas. É então apenas uma questão de impressão automática se começar com+numbers
Com dois arquivos GNU
sed
.Pré-requisito: Seu arquivo de log não contém nenhuma linha em branco.
Saída:
Ver
man sed
Isso será interrompido se o arquivo contiver blocos consecutivos com a mesma tag. O regex final do intervalo consumirá a tag para o próximo bloco.
Para comparação, comandos awk que não serão interrompidos nesse caso