Eu usaria cut , provavelmente. Ou seja, se, ao que parece, você souber onde esperar a string citada que está procurando.
Se eu fizer:
{ cut -sd\" -f2 |
grep -vFf- pat
} <<\IN
# <string name="Introduction">One day there was an apple that went to the market.</string>
# <string name="BananaOpinion">Bananas are great!</string>
# <string name="MessageToUser">We would like to give you apples, bananas and tomatoes.</string>
IN
... depois de salvar minha própria cópia do seu exemplo patterns.txt in pat e executar o comando acima, a saída é:
"ExitWarning"
"SomeMessage"
"Help"
cut imprime para stdout apenas o segundo " double-quote -d elimited -f ield para cada linha de entrada combinada pelo delimitador e -s pressiona todos os outros.
O que cut realmente imprime em grep é:
Introduction
BananaOpinion
MessageToUser
grep pesquisa seu operando de arquivo nomeado para as linhas que -v não correspondem às sequências -F ixed em seu - padrão stdin -f ile.
Se você puder confiar no segundo campo " -delimited como o que deve corresponder, então definitivamente haverá uma otimização sobre o modo grep -P erl combinando apenas sequências -F ixed e apenas pequenas porções deles porque cut faz o trabalho pesado - e faz isso rápido .