То, что вы хотите сделать, это использовать любые инструменты командной строки, это делается с помощью полнотекстовых программ поиска.
Чего-то гораздо меньшего можно достичь с помощью awk:
$ cat fts.awk
{ gsub( /[[:space:],."!?]+/, " ") }
FILENAME == "A" {
A[++cntA] = $0
next
}
FILENAME == "B" {
for ( nrA=1; nrA<=cntA; ++nrA) {
for ( first=1; first<=NF; ++first) {
for ( last=first; last<=NF; ++last) {
lookfor = (last == first) ? $first : lookfor " " $last
#print "lookfor=", lookfor
#print "<", A[nrA]
if ( index(A[nrA], lookfor)) {
#print "FOUND>", found, nrA, NR
found = lookfor
} else if (found) {
printf "Phrase \"%s\" found in File A line %d, file B line %d.\n",\
found, nrA, FNR
found = ""
break
}
}
}
}
}
Который можно назвать как:
$ awk -f fts.awk A B
Phrase "bananas in space" found in File A line 1, file B line 1.
Phrase "in space" found in File A line 1, file B line 1.
Phrase "space" found in File A line 1, file B line 1.
Как вы можете видеть, код уже становится сложным, хотя он почти не содержит ни одного из ваших списков функций, у него даже нет памяти, чтобы исключить показ подиндексов.