Поиск точного содержимого файла в другом файле с помощью сценария оболочки - PullRequest
0 голосов
/ 19 января 2020

У меня есть файл, содержащий заголовок лицензии. Например:

/*
 * first line 
 * second line
 */

Я бы хотел найти точный контент только в первых 4 строках моих исходных файлов. Я пытался использовать

grep -x -Ff "$ license_file" "$ c_file"

, но, к сожалению, grep ищет каждую строку, а не весь контент, поэтому может например, найдите строку "/ *" в середине файла. Как я могу искать весь контент? Спасибо!

1 Ответ

0 голосов
/ 19 января 2020

Вам может быть трудно найти многострочный шаблон. Поскольку этот ответ объяснен, вам, вероятно, нужно использовать pcregrep:

pcregrep -M -f "$license_file" "$c_file"

Однако в этом есть некоторые проблемы, поскольку он не проверяет ни позицию (начало файла в вашем случае), ни шаблон для многострочной формы. Во-первых, содержимое в $license_file должно быть похоже на

line 1\nline2\nline 3\nline 4\n

Так что, если вы можете отредактировать содержимое $license_file в требуемом формате, проблема может быть продолжена как

pcregrep -HMf"$license_file" --line-offsets "$c_file" | grep -o "^$c_file:1:" | sed 's/...$//'

Опция --line-offsets сообщит соответствующий номер строки, поэтому мы подбираем номер строки 1 и убираем номер строки, чтобы сообщить соответствующее имя файла. (Поскольку мы знаем, что номер строки = 1, а содержимое - в $license_file, поэтому я предполагаю, что вы хотите сообщить о соответствующих именах файлов.)

Если вы не можете редактировать $license_file, вы можете заменить его на sed:

pcregrep -HMf <(sed -En '1h;2,4H;4{x;s/\n|$/\\n/g;p}' "$license_file") --line-offsets "$c_file" | grep -o "^$c_file:1:" | sed 's/...$//'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...