看起来这很简单,但我遇到了麻烦。
我有一个文本文档,例如,如下所示:
这是一个 文字文件与
一些大写字词
但不是所有人都是 所有大写字母
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找到的很多解决方案似乎都是这样的工作没有按预期工作。
答案 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:]]
答案 4 :(得分:0)
“旧学校”RE的人物较少:
grep -o '[A-Z][A-Z]*' Untitled.txt
它使用-o
选项仅打印匹配的单词并匹配大写的A到Z。
将-w
添加到搜索字词中,-E
调用扩展正则表达式可以使这个更短:
grep -woE '[A-Z]+\>' Untitled.txt