grep 查连续重复单词需三步:一用 \ 锚定单词边界防子串误匹配;二用 -e 启用扩展正则并配合 ([:alpha:]+)[:space:]+\1 实现反向引用;三加 -i 忽略大小写、[:space:]+ 兼容多空格或 tab。

查找连续重复单词(比如 hello hello、the the)是 grep 中一个典型但容易出错的场景。问题不在于“能不能查”,而在于基础正则语法限制和单词边界处理不当——这是最常被忽略的两个疏漏点。
疏漏一:没用单词边界锚定,导致子串误匹配
很多人写 grep "the the" 或 grep "the\{2\}",结果匹配到 theme them 或 other the 这类非独立重复词。根本原因是没限定“单词边界”。
-
the the会错误匹配other the(因为中间有空格但不是完整词) - 正确做法必须用
\ 和 <code>\>(或\b,需配合-E)锚定词首词尾 - 例如:
grep "\<the> \<the>" file.txt</the></the>才真正匹配两个紧邻、独立的 the
疏漏二:基础正则(BRE)不支持直接反向引用,无法通用匹配任意重复词
想查“任意单词自己重复一次”,如 cat cat、and and、is is,不能靠简单字符串拼接。BRE 默认不支持 这类反向引用(即捕获后复用),直接写 \(.*\) 会失败,除非显式启用扩展语法。
- 错误写法:
grep "\(.*\) \1" file.txt→ 在多数 GNU grep 中不生效(BRE 下\1不被识别为反向引用) - 正确写法(推荐):
grep -E '([[:alpha:]]+) \1' file.txt - 说明:
-E启用扩展正则;[[:alpha:]]+匹配至少一个字母组成的单词;\1引用前面第一个括号捕获的内容
疏漏三:忽略大小写与空白变体,漏掉真实重复
实际文本中重复词常伴随大小写混用(The the)、多余空格或制表符(word\t\tword)、甚至换行(跨行重复极少但存在)。只查严格空格分隔的小写词,覆盖率极低。
- 加
-i忽略大小写:grep -iE '([[:alpha:]]+) \1' file.txt - 用
[[:space:]]+替代空格,兼容空格/制表符:grep -iE '([[:alpha:]]+)[[:space:]]+\1' file.txt - 若需容忍首尾空白,可加
^[[:space:]]*和[[:space:]]*$,但通常不必要
实用一行命令(推荐直接复制使用)
查所有相邻、大小写不敏感、由空白分隔的重复英文单词:
grep -iE '\' file.txt
-
\<...></...>确保前后都是单词边界(防class class被classic干扰) -
[[:alpha:]]+专注字母单词,排除数字或符号开头的“伪词” -
[[:space:]]+容忍多个空格或 tab,比单个空格健壮得多











