grep整个单词只由大写字母组成

时间:2016-01-30 21:08:40

标签: regex macos bash grep bsd

看起来这很简单,但我遇到了麻烦。

我有一个文本文档,例如,如下所示:

  

这是一个   文字文件与
  一些大写字词
  但不是所有人都是   所有大写字母
  iPhone

我想要的是解析这个文档,只匹配由大写字母组成的整个单词,如下所示:

  

文字文件
  有些人   但不是   所有大写字母

我写了这个:

grep -o "\w[[:upper:]]\w" Untitled.txt

这非常接近,但是,唉,这会回复:

  

TEX
  DOC
  UME
  SOM
  但
  不
  ALL
  CAP
  IPH

......坦率地说,我不明白。

那么:我可能会缺少什么? egrep在OS X下不能很好地工作,因为我受限于FreeBSD的grep(grep(BSD grep)2.5.1-FreeBSD),我想,我为egrep找到的很多解决方案似乎都是这样的工作没有按预期工作。

5 个答案:

答案 0 :(得分:5)

您错过了*\w也是任何单词字符。正确的正则表达式是:

\<[[:upper:]][[:upper:]]*\>

\< \>匹配字词边界

答案 1 :(得分:3)

补充Zbynek Vyskovsky - kvr000's helpful answer

grep -E选项允许使用扩展正则表达式,其中包括量词+表示一个或多个< / em>,简化了解决方案:

 grep -Eo '\<[[:upper:]]+\>' Untitled.txt

此外,正如Benjamin W.'s answer中所述,-w可用于匹配字边界,而无需将其指定为正则表达式的一部分:

 grep -Ewo '[[:upper:]]+' Untitled.txt

但请注意,-w非标准选项(但BSD / OSX和GNU grep都实现了它。)

至于egrep:它只不过是grep -E的(有效)别名,如上所述,它激活对扩展正则表达式的支持,但确切功能集是平台相关的

此外,只有GNU grep支持-P选项以支持PCRE(Perl兼容正则表达式),它提供更多功能和灵活性。

答案 2 :(得分:1)

示例输出显示同一行上的多个空格分隔的大写单词,可以使用

实现
$ grep -ow '[[:upper:]][[:upper:][:space:]]*[[:upper:]]' infile
TEXT DOCUMENT
SOME
BUT NOT
ALL CAPS

任何以大写字符开头和结尾的序列,以及它们之间的大写字符或空格。 -o仅返回匹配项,-w确保我们不匹配WORDlowercase之类的内容。

答案 3 :(得分:0)

您可以使用此命令:

grep -o -E "\<[[:upper:]]+\>" Untitled.txt
  • -E激活扩展的正则表达式,这使+可用,代表重复1次或更多次
  • \<\>是标记单词开头和结尾的锚点
  • 整个正则表达式是指构成整个单词的一个或多个大写字符的序列

您的原始正则表达式为您提供了三个字母匹配,因为\w代表[_[:alnum:]],因此您指示grep匹配由三个字符组成的内容:

  • [_[:alnum:]]
  • 中的第一个和第三个
  • 来自[[:upper:]]范围的第二个

答案 4 :(得分:0)

“旧学校”RE的人物较少:

grep -o '[A-Z][A-Z]*' Untitled.txt

它使用-o选项仅打印匹配的单词并匹配大写的A到Z。

-w添加到搜索字词中,-E调用扩展正则表达式可以使这个更短:

grep -woE '[A-Z]+\>' Untitled.txt