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>
Erwartete Ausgabe:
"ExitWarning"
"SomeMessage"
"Help"
Wie drucke ich die Begriffe aus, in patterns.txt
denen sich nichts befindet Strings.xml
? Ich kann die abgestimmt / unerreichten Drucklinien in Strings.xml
, aber wie drucke ich die unerreichten Muster ? Ich benutze ggrep (GNU grep) Version 2.21, bin aber offen für andere Tools. Entschuldigung, wenn dies ein Duplikat einer anderen Frage ist, die ich nicht finden konnte.
Strings1.xml
undStrings2.xml
), benötigen Sie auch das-h
Flag auf dem ersten Grep.grep
unterstützen diese Option. Wenn Sie mehrere Eingabedateien haben, verstehe ich nicht, warum Sie sie nichtcat
alle haben können und leiten Sie das Ergebnis angrep
.Der beste Ansatz ist wahrscheinlich der, den @don_crissti vorgeschlagen hat. Hier ist eine Variation desselben Themas:
Dies ist im Grunde das Gegenteil von @ don_crisstis Ansatz. Es verwendet grep mit Perl-kompatiblen regulären Ausdrücken (
-P
) und dem-o
Schalter, um nur den passenden Teil der Zeile zu drucken. Dann suchtname=
und verwirft der Regex (\K
) und sucht dann nach einem oder mehreren Zeichen bis zum ersten"
(.+?"
). Dies ergibt die Liste der in derString.txt
Datei vorhandenen Muster, die dann als Eingabe an ein umgekehrtes grep (grep -v
) unter Verwendung von process substitution (<(command)
) übergeben werden.quelle
Ich würde
cut
wahrscheinlich verwenden. Das heißt, wenn Sie, wie es scheint, wissen, wo Sie die angeführte Zeichenfolge erwarten können, nach der Sie suchen.Wenn ich mache:
... nachdem ich meine eigene Kopie Ihres Beispiels
patterns.txt
inpat
gespeichert und den obigen Befehl ausgeführt habe, lautet die Ausgabe:cut
Drucke auf stdout nur die zweite"
doppelte Anführungszeichen-d
elimited-f
ield für jeden Begrenzer abgestimmte Eingabezeile und-s
uppresses alle anderen.Was
cut
tatsächlich gedruckt wird,grep
ist:grep
sucht seine benannte Datei - Operanden für Linien , die-v
die nicht übereinstimmen-F
ixed Strings in seine-
stdin Muster-f
ile.Wenn Sie sich darauf verlassen können, dass das
"
zweitbegrenzte Feld übereinstimmt, dann ist dies definitiv eine Optimierung gegenüber demgrep
-P
Erl-Modus, indem Sie nur-F
festgelegte Zeichenfolgen und nur winzige Teile davon zusammenfügen, dacut
dies das schwere Heben bewirkt - und es geht schnell .quelle
Es ist leicht zu verstehen, hat aber die Ausfallzeit, mehrere grep-Prozesse zu erzeugen, einen für jede Zeile in patterns.txt.
quelle
Eine andere Möglichkeit besteht darin, patterns.txt und Strings.xml in eine Liste aufzunehmen und nach eindeutigen Zeilen zu suchen
Erläuterung:
cat patterns.txt Strings.xml
fasst alles in einer Liste zusammen.grep -oFf patterns.txt
Entfernt den Müll in jeder Zeile.sort
selbsterklärend. sortiere alle Zeilen.uniq -u
druckt nur einzelne Zeilen.quelle