patterns.txt:
"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"
strings.xml
<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>
Ожидаемый результат:
"ExitWarning"
"SomeMessage"
"Help"
Как мне распечатать термины patterns.txt
, которые не встречаются в Strings.xml
? Я могу напечатать совпавшие / несовпадающие строки в Strings.xml
, но как я могу печатать несовпадающие модели ? Я использую ggrep (GNU grep) версии 2.21, но я открыт для других инструментов. Извиняюсь, если это дубликат другого вопроса, который я не смог найти.
Strings1.xml
иStrings2.xml
), вам также понадобится-h
флаг на первом grep.grep
поддерживают эту опцию. Если у вас есть несколько входных файлов, я не понимаю, почему вы не можете простоcat
их всех и передать результатgrep
.Наилучшим подходом, вероятно, является то, что предложил @don_crissti, так что вот вариант на ту же тему:
Это в основном обратный подход @ don_crissti. Он использует grep с регулярными выражениями, совместимыми с Perl (
-P
), и-o
переключателем для печати только соответствующей части строки. Затем регулярное выражение ищетname=
и отбрасывает его (\K
), а затем ищет один или несколько символов до первого"
(.+?"
). В результате получается список шаблонов, присутствующих вString.txt
файле, который затем передается в качестве входных данных в обратный grep (grep -v
) с использованием процесса substitution (<(command)
).источник
Я бы использовал
cut
, наверное. То есть, если, как оказалось, вы знаете, где ожидать искомую строку в кавычках.Если я сделаю:
... после того, как спас мою собственную копию вашего примера
patterns.txt
в состоянииpat
продолжить вышеуказанную команду на выходе является:cut
выводит в stdout только вторую"
двойную кавычку с-d
разделителем-f
ield для каждой строки ввода, сопоставленной с разделителем, и-s
подавляет все остальные.Что на
cut
самом деле печатает наgrep
это:grep
ищет в названном файловом операнде строки, которые-v
не соответствуют-F
ixed строкам в его файле-
stdin-f
.Если вы можете полагаться на второе
"
поле с ограничением в качестве того, которое должно соответствовать, то это определенно будет оптимизация по сравнению сgrep
-P
режимом erl, просто сопоставляя-F
ixed строки и только крошечные их части, потому чтоcut
выполняет тяжелую работу - и делает это быстро .источник
это легко понять, но время простоя порождает несколько процессов grep, по одному на каждую строку в patterns.txt.
источник
Другой способ - поместить patterns.txt и Strings.xml в один список и найти уникальные строки.
объяснение:
cat patterns.txt Strings.xml
помещает все в один список.grep -oFf patterns.txt
удаляет мусор на каждой строке.sort
само за себя. сортировать все строки.uniq -u
печатает только уникальные линии.источник