Construa um padrão a partir das listas de palavras. De file1.txt
contendo, e. one
, un
, eins
e file2.txt
contendo two
, deux
, zwei
, você precisa obter a expressão regular (na sintaxe ERE)
(one|un|eins).*(two|deux|zwei)
Se as listas de palavras não contiverem caracteres especiais em um regex, tudo o que você precisa fazer é substituir as novas linhas por |
(o operador “ou”), exceto o final.
words1=$(tr '\n' '|' <file1.txt); words1=${words1%\|}
words2=$(tr '\n' '|' <file2.txt); words2=${words2%\|}
grep -E "($words1).*($words2)"
Se as listas de palavras puderem conter caracteres especiais, será necessário citá-las.
words1=$(<file1.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words1=${words1%\|}
words2=$(<file2.txt tr '\n' '|' | sed 's/[][\().*?+|]/\&/g'); words2=${words2%\|}
grep -E "($words1).*($words2)"
Observe que, se você não se importar com a ordem das palavras e aceitar correspondências sobrepostas (por exemplo, aceitar twone
como contendo one
e two
), tudo o que você precisa é de duas invocações grep:
grep -f file1.txt | grep -f file2.txt