O comando
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;' file
imprime parágrafos que contêm a string AAA
.
Isso chama sed
com o seguinte script sed
:
/./{
H
$!d
}
x
/AAA/!d
Versão anotada:
/./{ # When hitting a line that contains at least one character...
H; # Append the line to the "hold space".
$!d; # If it's not the last line, delete it.
}
x; # Swap the hold space and the pattern space.
/AAA/!d; # Delete the pattern space if it does not contain the string "AAA"
# (implicit print)
Portanto, em suma, ele coleta linha após linha no "espaço reservado" (um buffer de uso geral em sed
) e, quando encontra uma linha vazia (o padrão /./
não corresponde), ele determina se a coleção de linhas armazenadas contiver a string AAA
e imprimi-la, se houver.
Isso também é descrito em uma resposta aqui: GREP / SED ou AWK: imprime um parágrafo inteiro em um arquivo na correspondência de padrões
Dado o arquivo
this is
a paragraph
this is
another one
this paragraph
contains the string
AAA
Ele produziria o último parágrafo (com uma linha vazia principal).
Para se livrar da linha vazia que estará precedendo cada parágrafo (se é isso que você quer), use
/./{
H
$!d
}
x
/AAA/!d
s/\n//
Ou, na linha de comando
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;s/\n//'