grep
é bastante estúpido quando se trata de padrões multilinhas, mas traduzir todos os caracteres newline \n
do padrão e do texto para pesquisar em caracteres NUL
antes de compará-los corrige isso. Também é necessário traduzir \n
file1
na saída para file2
.
Este é o seu comando, supondo que <(tr '\n' '
contenha o padrão que você deseja pesquisar em file1
' < file1)<(tr '\n' '
: file2
' < file2)
grep -aof <(tr '\n' 'A B
C D
E F
G H
' < file1) <(tr '\n' 'grep -aof <(tr '\n' 'A B
C D
E F
G H
' < file1) <(tr '\n' '%pre%' < file2) | tr '%pre%' '\n'
' < file2) | tr '%pre%' '\n'
Exemplo de saída para seus arquivos:
%pre%Explicação:
-
grep -f PATTERN_FILE INPUT_FILE
cria um objeto FIFO / pipe nomeado / semelhante a um arquivo temporário que é igual aPATTERN_FILE
, mas com todos os caracteres de nova linha traduzidos para caracteres NUL. -
INPUT_FILE
faz o mesmo, mas para-a
. -
grep
procura o (s) padrão (s) de
em-o
grep
. - O
| tr '%code%' '\n'
sinalizador de %code% ativa a correspondência em arquivos binários. Isso é necessário porque, do contrário, ele ignora arquivos que contêm caracteres não imprimíveis, como %code% . - O sinal %code% de %code% faz com que seja impressa apenas a sequência correspondente, não toda a linha em que foi encontrada.
- %code% traduz todos os caracteres NUL da saída do comando no lado esquerdo de volta para os caracteres de nova linha.