如何使用grep仅匹配由大写字母组成的单词

12

我有一个问题,需要编写grep命令,它只能匹配那些仅由大写字母组成的单词所在的行。

例如,我有一个文件:file1.txt

Abc AAA
ADFSD
F
AAAAx

输出应该是:

Abc AAA
ADFSD
F

感谢任何建议。


3
为什么ABC是输出的一部分? - Behe
2
打印出只由大写字母组成的单词所在的行。 - Tempus
请在使用标签之前仔细阅读它们的描述,特别是“Linux”和“Unix”的描述,它们并不适用于此处。 - Ulrich Eckhardt
7个回答

15

您可以直接使用:

grep -E '\b[[:upper:]]+\b' file1.txt

也就是说,寻找仅由大写字母组成的完整单词。


10

这个egrep应该可行:

egrep '\b[A-Z]+\b' file

file包含带有下划线的大写单词(例如HELLO_WORLD)时,这将无法正常工作。 - alhelal
“_” 不被视为单词边界,因此 “HELLO_WORLD” 并不是仅由大写字母组成的单词。 - anubhava
我认为“_”在单词边界上,但不是有意义的单词边界。如果我错了,您可以给我一个参考,让我学到新的东西。谢谢您提供有趣的信息。 - alhelal
请参考此问答:https://dev59.com/33M_5IYBdhLWcg3wjj-r - anubhava
2
在那里他们说“...使用单词字符([0-9A-Za-z_])”。非常感谢您提供这样的链接。这个想法对我来说是新的。 - alhelal

3
这将产生期望的结果。
egrep '\b[A-Z]+\b'  file1.txt

结果是

Abc AAA
ADFSD
F

[^ ]* 似乎允许混合大小写? - tripleee
是的,这将允许混合大小写;如果你只想要大写字母和下划线,我建议使用 grep -w '\([_]*[A-Z]\+\)\+' file1.txt; - Alex Walczak
(并允许前面无限的下划线:grep -w '[_]*[A-Z]\+[A-Z_]*' file1.txt - Alex Walczak
@awalllllll 你是对的,我的原始答案允许混合大小写。 - CS Pei
@tripleee,抱歉,我错了,答案已更新。 - CS Pei

1
如果您的输入包含非ASCII字符,则可能希望使用\p{Lu}而不是[A-Z]:
grep -P '\b\p{Lu}+\b' file

对于

LONDON 
Paris
MÜNCHEN Berlin

这将返回
LONDON
MÜNCHEN Berlin

你可以手动列出这些内容,就像@Skippy-le-grand-gourou所说的那样,egrep将[A-Z]扩展到重音字母,但是使用\p{Lu},你不需要处理像"自2017年6月以来,大写字母ẞ被接受作为全大写风格的替代品"这样的事情。

+1 对于可行的替代方案,但是值得一提的是,anubhava的答案使用egrep正确地显示并触发了重音字符。 - Skippy le Grand Gourou

1
GNU grep支持POSIX模式,因此您可以简单地执行以下操作:
grep -e '[[:upper:]]' file1.txt

2
啥?这会在任何地方找到大写字母。 - tripleee

1
grep -oP '\b[A-Z0-9_]+\b' file1.txt  

这将生成由大写字母/数字/_ 组成的单词(例如 HELLO, NUMBER10, RLIMIT_DATA)。
但是,它也接受 eDw

0

在 file1.txt 中搜索 '\<[A-Z]*>'


1
这个什么也不做。 - alhelal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接