ファイルのgrepとパターンを使用して一致しないパターンを印刷する

ファイルのgrepとパターンを使用して一致しないパターンを印刷する

パターン.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 -vpatterns.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.txtgrep -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-vstdinパターンファイルの固定文字列と一致しない行の名前付きファイルオペランドを検索します。-F--f

2番目に"区切られたフィールドを一致フィールドとして使用して固定文字列とその一部のみを一致させることができる場合は、確かにgrep -Perlパターンが最適化されます。なぜなら、重い仕事が行われるからです。-Fcut早く

答え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一意の行だけが印刷されます。

関連情報