grep
довольно глупый, когда дело доходит до многострочных шаблонов, но перевод всех символов новой строки \ n
как шаблона, так и текста для поиска в символы NUL \ 0
перед сравнением исправляет это. Очевидно, также необходим перевод \ 0
в выводе обратно в \ n
.
Вот ваша команда, предполагая, что file1
содержит шаблон, который вы хотите искать в file2
:
grep -aof <(tr '\n' '\0' < file1) <(tr '\n' '\0' < file2) | tr '\0' '\n'
Пример вывода для ваших данных файлов:
A B
C D
E F
G H
Пояснение:
<(tr '\ n' '\ 0' создает FIFO / именованный канал / временный файловый объект, который равен file1
, но все символы новой строки переведены в символы NUL.
<(tr '\ n' '\ 0' делает то же самое, но для file2
.
grep -f PATTERN_FILE INPUT_FILE
ищет шаблоны из PATTERN_FILE
в INPUT_FILE
. -a
в grep
включает сопоставление двоичных файлов. Это необходимо, потому что в противном случае будут пропущены файлы, содержащие непечатаемые символы, такие как \ 0
. -o
команды grep
заставляет выводить только соответствующую последовательность, а не всю строку, в которой она была найдена. | tr '\ 0' '\ n'
переводит все символы NUL из вывода команды слева обратно в символы новой строки.