2016-01-30 28 views
2

这似乎很简单,但我遇到了麻烦。grep整个单词由大写字母组成

我有一个文本文件,看起来,例如,像这样:

这是一个
文本文档与
一些大写单词
但不是所有的人都
全部大写
iPhone

我想解析的是在文件和匹配全字仅由大写字母,就像这样:

文本文档
一些
BUT NOT
全部大写

我写了这个:

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的解决方案,好像他们会工作不按预期工作。

+1

你或许意味着'\ B',而不是'\ w'? – Biffen

+0

根据你接受的答案,似乎在你自己的line_上输出每个全大写单词_就是你想要的,而不像你期望的样本输出所表明的那样;也许你可以相应地修改你的预期样本输出(有一个解释性说明,因为至少有一位受访者试图解决原始样本输出提出的不同问题)。 – mklement0

回答

5

你错过了*\w是任何字的字符。正确的regexp是:

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

\<\>匹配字边界

+0

谢谢,我会在几分钟内将你的答案标记为答案。 – celestialroad

1

示例输出显示的多个空间分离在同一行上大写单词,其可与

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

任何起始序列和来实现以大写字符结尾,大写字符或空白字符之间。 -o仅返回匹配项,-w确保我们不匹配WORDlowercase之类的内容。

+0

'-w'很有帮助,但请注意,包含'[:space:]'没有任何意义,因为根据定义,单词中没有空格。虽然你的命令仍然按照_GNU_' grep'的意图工作,但它使用OP所使用的_BSD_“grep”不会_not_。 – mklement0

+0

@ mklement0所以它仍然只返回单个单词?我查看了BSD grep手册页中的'-w'选项,并认为“好像被'[[:<:]]'和'[[:::]]''包围”会返回多个单词...显然不。 –

+0

我知道你在试图在单行上返回多个连续的大写单词,就像在OP的示例输出中一样。 但我怀疑这并不是他们真正想要的,但是,根据他们接受的答案:似乎在自己的行上输出每个大写单词就足够了。 BSD Grep在你的案例中实际做了什么只是匹配由大写字母组成的行_solely_,不要问我为什么。 另请注意,即使使用GNU Grep,您的命令也会变得古怪:如果行的最后一个单词是全大写单词,则还会捕获尾随空白。 – mklement0

0

你可以使用这个命令:

grep -o -E "\<[[:upper:]]+\>" Untitled.txt 
  • -E激活扩展的正则表达式,这使得+可用其放置1次或多次重复
  • \<\>是锚标记的开始和一个结束字
  • 整个装置的正则表达式中的一个或多个大写字符的序列组成全词

你原来的正则表达式给你三个字母的比赛,因为\w代表[_[:alnum:]],所以你指示的grep匹配的东西它由三个大字:

  • 第一和第三从[_[:alnum:]]
  • 第二从[[:上:]]范围
3

为了补充Zbynek Vyskovsky - kvr000's helpful answer

grep-E选项允许使用的扩展正则表达式,其包括量词+意指一个或多个,这简化了解决方案:

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兼容的正则表达式),它提供了更多的功能和灵活性。

+0

谢谢你。有趣的是,你答案中的第一条命令明显比第二条命令快。 (我使用的实际文本文档很长。) – celestialroad

+0

@celestialroad:那的确是好奇,感谢您的反馈意见;无关:我添加了关于'egrep'的注释。 – mklement0

0

的“老派” RE将更少的字符:

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

它使用-o选项只打印匹配的单词和反对大写字母A到Z匹配

添加-w搜索词和-E调用扩展正则表达式允许这一个是更短:

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

+0

这将仅限于ASCII字母,因此只能在明确要排除外来字母的情况下使用。 – mklement0

相关问题