Я бы, наверное, использовал разрез
. То есть, если, как кажется, вы знаете, где ожидать строку в кавычках, которую вы ищете.
Если я сделаю:
{ 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
... после сохранения моей собственной копии вашего примера patterns.txt
в pat
и выполнения вышеуказанной команды, вывод будет:
"ExitWarning"
"SomeMessage"
"Help"
cut
выводит в стандартный вывод только второй "
двойные кавычки -d
исключенный -f
поле для каждой строки ввода, совпадающей с разделителем, и -s
подавляет все остальные.
То, что cut
на самом деле печатает в grep
, это:
Introduction
BananaOpinion
MessageToUser
grep
ищет в своем именованном файловом операнде строки, которые -v
не соответствует фиксированным строкам -F
в его -
шаблоне stdin -f
файл.
Если вы можете положиться на второе поле "
-delimited в качестве подходящего, тогда это определенно будет оптимизация по сравнению с режимом grep
-P
erl, просто сопоставив -F
фиксированные струны и только крошечные их части, потому что cut
делает тяжелую работу - и делает это быстро .