模式.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)
最好的方法可能是@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 ( )。