sed 's/\./\\./g; s/\*/./g' file2 | xargs -I{} grep {} file1
Пояснение:
Я бы воспользовался соответствием регулярного выражения. Для этого нам нужно превратить каждую звездочку *
в точку .
, которая представляет любой символ в регулярных выражениях. В качестве побочного эффекта от включения регулярных выражений нам нужно экранировать все специальные символы, в частности .
, чтобы их можно было воспринимать буквально. В регулярном выражении нам нужно использовать \.
для представления точки (в отличие от любого символа).
Первый шаг - выполнить эти замены с помощью sed
, второй - передать каждую результирующую строку в качестве шаблона поиска на grep
и выполнить поиск file1
для этого шаблона. Клей, который позволяет это сделать, - xargs
, где {}
- это заполнитель, представляющий одну строку из результатов команды sed
.
Примечание:
Это не общее, безопасное решение, которое вы можете просто скопировать и вставить: вы должны следить за любыми символами в вашем файле, содержащими звездочки, которые считаются специальными в регулярных выражениях grep.
Обновление:
jhnc расширяет экранирование до любого из следующих символов: .\^$[]
, таким образом, учитывая почти все виды адресов электронной почты. Затем он / она избегает использования xargs
, используя -f -
для передачи результатов sed
в качестве выражений поиска в grep
:
sed 's/[.\\^$[]/\\&/g; s/[*]/./g' file2 | grep -f - file1
Это решение является более общим и более эффективным, см. Комментарий ниже.