Você pode transformar parágrafos em linhas únicas, usar grep -f matchfile
no resultado e restaurar as novas linhas:
sed '/^$/s/^/\x02/' myfile | tr \n$'sed '/^$/s/^/\x02/' myfile | tr \n$'%pre%2' $'%pre%3'\n \
| grep -f matchfile | tr $'%pre%3' \n | head -n -1
2' $'%pre%3'\n \
| grep -f matchfile | tr $'%pre%3' \n | head -n -1
Você pode fazer sem o head
se a linha vazia na saída não incomodar você.
Então ... sed
adiciona \x02
ao início de cada linha vazia, então tr
traduz todas as novas linhas para \x03
e todas \x02
para novas linhas (efetivamente transformando todos os parágrafos em linhas únicas onde as linhas originais são campos separado por algum caracter baixo ascii que é improvável que ocorra em seu arquivo de texto - nesse caso, \x03
), então grep
seleciona apenas as "linhas" correspondentes ; finalmente, o segundo tr
restaura as novas linhas e head
descarta a linha vazia à direita (você pode usar qualquer outra ferramenta, por exemplo, sed \$d
).
Realmente, a maneira mais fácil de entender como isso funciona é executá-lo em etapas: execute apenas o primeiro comando, depois o primeiro & 2º e assim por diante ... e observar a saída - deve ser auto-explicativo 1 .
1: se você se familiarizou com tr
depois de ler o manual ...