打印不匹配的模式,使用 grep 和文件中的模式

Nat*_*ook 18 grep

模式.txt:

"BananaOpinion"
"ExitWarning"
"SomeMessage"
"Help"
"Introduction"
"MessageToUser"
Run Code Online (Sandbox Code Playgroud)

字符串.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>
Run Code Online (Sandbox Code Playgroud)

预期输出:

"ExitWarning"
"SomeMessage"
"Help" 
Run Code Online (Sandbox Code Playgroud)

如何打印在 中patterns.txt找不到的术语Strings.xml?我可以打印匹配/不匹配的线路Strings.xml,但我如何打印出无与伦比的模式?我正在使用 ggrep (GNU grep) 2.21 版,但我对其他工具持开放态度。如果这是我找不到的另一个问题的重复,我深表歉意。

don*_*sti 28

您可以使用grep -o仅打印匹配部分并将结果用作grep -v原始patterns.txt文件上的模式一秒钟:

grep -oFf patterns.txt Strings.xml | grep -vFf - patterns.txt
Run Code Online (Sandbox Code Playgroud)

尽管在这种特殊情况下,您也可以使用join+ sort

join -t\" -v1 -j2 -o 1.1 1.2 1.3 <(sort -t\" -k2 patterns.txt) <(sort -t\" -k2 strings.xml)
Run Code Online (Sandbox Code Playgroud)


ter*_*don 5

最好的方法可能是@don_crissti 建议的,所以这里有一个关于同一主题的变体:

$ grep -vf <(grep -Po 'name=\K.+?"' Strings.xml) patterns.txt
"ExitWarning"
"SomeMessage"
"Help"
Run Code Online (Sandbox Code Playgroud)

这基本上与@don_crissti 的方法相反。它使用带有 Perl 兼容正则表达式 ( -P) 的grep和-o开关来仅打印该行的匹配部分。然后,正则表达式查找name=并丢弃它 ( \K),然后查找一个或多个字符,直到第一个"( .+?")。这导致String.txt文件中存在模式列表,然后grep -v使用进程替换( <(command))作为输入传递给反向 grep ( )。