Похоже, ваши критерии на самом деле:
- Файл шаблона - это на самом деле список STRINGS, а не список регулярных выражений (в котором точка (
.
) соответствует любому отдельному символу), - Шаблоны предназначены для сопоставления только в конце строк (так что в конце каждой строки в файле шаблона есть неявное значение
$
).
Чтобы соответствовать первому критерию, вы можете использовать опцию grep -F
:
$ grep -F -f pattern_file data_file
Но это не помогает с .re
, который встроен в середине одной из строк.Если вы можете изменить файл шаблона, изменив строки так:
\.com$
\.re$
\.net$
превратит их в нужные вам регулярные выражения.В противном случае вам, возможно, придется использовать что-то для PARSE этого файла шаблона, чтобы создать искомое регулярное выражение.Например, используя массив bash и некоторое расширение параметров:
$ mapfile -t a < pattern_file
$ declare -p a
declare -a a=([0]=".com" [1]=".re" [2]=".net")
$ printf -v new_re '|%s' "${a[@]}"
$ new_re="${new_re//./\\.}" # escape dots within regex
$ new_re="(${new_re:1})\$" # strip leading or-bar
$ echo "$new_re"
(\.com|\.re|\.net)$
$ grep -E "$new_re" data_file
www.remix3d.com
www.verisign.net
Или, если вы не возражаете, полагаясь на еще один инструмент для уменьшения количества строк:
$ grep -f <(sed 's/\./\\./g;s/$/$/' pat) file
www.remix3d.com
www.verisign.net