パターン.txt:
"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"
string.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を使用していますが、他のツールも使用できます。見つからない他の質問と重複している場合は申し訳ありません。
答え1
一致する部分のみを印刷し、結果をgrep -o
元のファイルのパターンとして使用できます。grep -v
patterns.txt
grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt
join
この特別な場合は+を使用することもできますsort
。
join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)
答え2
最善のアプローチは、おそらく@don_crisstiが提案したものです。したがって、同じトピックの変形は次のようになります。
$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"
これは基本的に@don_crisstiのアプローチとは反対です。 Perl準拠の正規表現(grep -P
)であるgrep-o
と一致する行部分のみを印刷するスイッチを使用します。次に、正規表現はその文字を見つけname=
て削除し、()最初の文字()\K
まで1つ以上の文字を見つけます。これはファイルに存在するパターンのリストを生成し、逆のgrep()への入力として渡されます。"
.+?"
String.txt
grep -v
プロセスの交換(<(command)
)。
答え3
私はそれを使用することもできますcut
。つまり、探している引用文字列をどこで見つけることができるかを知っている場合です。
私がするなら:
{ 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
標準出力に一致する各区切り文字に対して、入力行の2番目の二重引用符"
で囲まれたフィールドのみを印刷し、-d
他のすべてのフィールドは表示しません。-f
-s
cut
実際に印刷される内容はgrep
次のとおりです。
Introduction
BananaOpinion
MessageToUser
grep
-v
stdinパターンファイルの固定文字列と一致しない行の名前付きファイルオペランドを検索します。-F
-
-f
2番目に"
区切られたフィールドを一致フィールドとして使用して固定文字列とその一部のみを一致させることができる場合は、確かにgrep
-P
erlパターンが最適化されます。なぜなら、重い仕事が行われるからです。-F
cut
早く。
答え4
もう1つの方法は、Patterns.txtとStrings.xmlをリストに入れて一意の行を見つけることです。
cat patterns.txt Strings.xml | grep -oFf patterns.txt | sort | uniq -u
説明する:
cat patterns.txt Strings.xml
すべてをリストに入れます。
grep -oFf patterns.txt
各行のジャンクを削除します。
sort
それは言うまでもありません。すべての行を並べ替えます。
uniq -u
一意の行だけが印刷されます。