![Grep:过滤问题](https://linux22.com/image/869080/Grep%EF%BC%9A%E8%BF%87%E6%BB%A4%E9%97%AE%E9%A2%98.png)
我需要构建一个正则表达式来过滤以相同单词开头和结尾的一组单词。例如,the life of the free
将输出the life of the
和he was and he his the same
将输出he was and he
。这两个单词之间的最大距离必须为 10 个字符。
答案1
使用 PCRE,可以执行以下操作:
grep -Po '\b(\w+)\b.{1,10}\b\1\b'
-P
使用 PCRE 启用 Perl 风格的正则表达式。-o
仅打印匹配的文本。\b
标记单词边界(\w+)
将匹配的单词字符分组.{1,10}
匹配最多 10 个字符,至少 1 个。\1
指的是之前匹配到的组。
答案2
尝试grep
使用扩展正则表达式:
$ echo "the life of the free" | grep -Eo "(\b[[:alnum:]]+\b)([[:blank:]]|[[:alnum:]]){1,10}\1"
the life of the
$ echo "he was and he his the same" | grep -Eo "(\b[[:alnum:]]+\b)([[:blank:]]|[[:alnum:]]){1,10}\1"
he was and he
这里的-E
意思是扩展正则表达式,-o
意思是只打印行中匹配的部分,\b
匹配单词边界,字符类[[:alnum:]]
意思是所有字母(大写和小写)和数字字符,[[:blank:]]
意思是空格或制表符,+
意思是前一个匹配出现一次或多次,{1,10}
前一个匹配可以出现 1 到最多 10 次,\1
意思是匹配第一个匹配的组(在第一对括号之间表示),即\b[[:alnum:]]+\b
。