как убить задание в фоновом режиме?

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 из вывода команды слева обратно в символы новой строки.
3
30.03.2016, 01:31
0 ответов

Теги

Похожие вопросы