GREP和RegEx - 找到模式并再次查找

Mat*_*uor 4 regex grep

这就是我想要做的事情:

在文档中搜索包含RegEx的模式,然后检查这个确切的模式是否在一行内存在两次.

Content of file.xml:
(some code) "testen"  (more code)  >testete<
(some code) "bleiben" (more code)  >bleiben<
(some code) "stehen"  (more code)  >stand<
(some code) "hängen"  (more code)  >hängten<
... 
Run Code Online (Sandbox Code Playgroud)

现在我想检查.*en并检查(确切)相同的单词是否在该行中出现两次.所以结果应该是:

bleiben
Run Code Online (Sandbox Code Playgroud)

因为Testen!= testete,stehen!= stand,hängen!=hängten

有没有办法做到这一点?

new*_*rey 7

您可以grep使用模式在第一行处理此搜索.*en.*en:

grep .*en.*en your_file
Run Code Online (Sandbox Code Playgroud)

这将只输出en出现两次的行.

如果你需要在两个背靠背中处理它grep,你仍然可以在管道版本中使用相同的命令:

grep .*en your_file | grep .*en.*en
Run Code Online (Sandbox Code Playgroud)

此外,如果您想增加同一行中的实例数,可以利用grep's -P选项并使用Perl正则表达式:

grep -P "(.*en){2}" your_file
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以只改变{2}你希望它出现在一行中的多个实例,它应该可以工作.

编辑(找到两次完全相同的单词的行)

如果没有可以定义单词边界的扩展模式,这很困难 - 而您的示例输出实际上并没有多大帮助.去直来了点例子,我们可以只承担一个"字"是任何字母串a-z一个与结束en.您可以根据需要自定义此边界:

grep -P "([a-z]+en).*\1" your_file
Run Code Online (Sandbox Code Playgroud)

这将打印任何行结尾en的行,该行在行(the \1)的其他位置找到.

值得一提的是,这与上面提到的词边界问题有关.在"bleiben"和"bleiben"的背景下,它们是平等的.然而,在"ben"和"bleiben"的上下文中,该模式将匹配,因为它将看到从"bleiben"结束"ben"作为匹配模式(从而使用"ben"="ben").如果这是不可接受的,你将不得不建立一个更严格的字边界(即 - 不允许特殊字符?).