3

我只是好奇为什么 grep 以这种方式匹配事物。

例如,假设我正在尝试查找在一个句子中出现两次的单词(而不是作为其他单词的一部分)。所以我试图找到如下行:

hello everybody hello

而不是像下面这样:

hello everybody hellopeople 

那么为什么以下 grep 表达式有效:

grep -E '(\<.*\>).*\<\1\>' file

而不是以下内容:

grep -E '(\<.*\>).*\1' file

我原以为第二个会起作用,因为单词边界(\< 和 \>)在第二个匹配的括号内,但事实并非如此。必须在反向引用周围设置单词边界似乎相当令人困惑,有人可以解释为什么 grep 以这种方式匹配行,或者可能进一步详细说明这个想法吗?

4

2 回答 2

4

无法在捕获组中捕获零宽度断言/零长度匹配。\b or \< \>是零长度匹配。不能成组抓拍。与零宽度断言相同,例如向后/向前看。

例如:

((?<=#)\w+(?=#)).*\1

将匹配字符串

#hello# everybody hellofoo

PS您可能想要使用\w+而不是.*在您的单词边界内使用。

于 2014-12-27T21:01:16.030 回答
-2

awk如果您没有得到任何好的解决方案,您可以像这样使用它来解决它grep

awk '{for (i=1;i<=NF;i++) if (a[$i]++) print $i;delete a}'
hello

如果一个单词在一行中出现不止一次,打印它。

于 2014-12-27T20:24:30.817 回答