我只想查找以大写字母开头的单词。言语必须遵循这种模式。 “嗯嗯”。
我有一个带有文本的 .txt 文件。我尝试使用 grep 但没有成功。
答案1
因此,您需要一个大写字母后跟 4 个字符,例如:
$ cat test
lower
Upper
notrequired
This1
$ grep '[A-Z]....' test
Upper
This1
点 ( .
) 匹配除换行符之外的任何字符。
答案2
如果您grep
支持非标准-w
和-o
选项,您可以这样做:
grep -wo '[[:upper:]][[:lower:]]*'
输出由一个大写字母后跟 0 个或多个小写字母组成的o
单词w
(在这种情况下,单词由非单词字符分隔,单词字符是数字或下划线)。
例如,对于这样的输入:
Let's rock the UK, Stéphane! tEst Test2
它输出:
Let
Stéphane
只要é
表示为单个小写 U+00E9 字符即可。如果它被表达为e
后面跟着 U+0301 结合尖锐的口音,你会得到Let
andSte
相反,U+0301 不被认为是一个字字符。
您可能还想接受组合标记来解决这个问题,为此您需要类似grep
withperl
的正则表达式支持:
grep -Po '\G(\X*(?=[^\w])\X)?\K\p{Lu}[\p{Ll}\pM]*+(?!\w)'
在哪里:
\G
匹配行的开头或上一场比赛的结尾之后。\X
匹配字素簇,因此将包括基本字符和所有组合标记(或更一般地分解的字符),而不允许它们被分解。(?=[^\w])\X
是一个由非单词字符引导的字素簇,以确保我们找到的单词像 with 一样被正确分隔,grep -w
以便例如Foo
如果在 include 中找到则不会报告,éFoo
然后 é 表示为e<U+0301>
。\K
重置比赛的开始,因此我们只K
读取(和o
输出)右侧的内容。\G
与 结合使用\K
通常可以解决在 perl/PCRE 中使用固定长度匹配来查找操作符的事实。\p{Lu}
u
与ppercaseL
etter rperty匹配字符p
,perl 相当于 POSIX'[[:upper:]]
。\pM
对于M
方舟,\p{Ll}
对于l
小柜字母L
。*+
类似于*
但禁止回溯,以便永久包含所有标记和小写字母,所以我们不必担心标记:(?!\w)
,对 a 的负面展望字字符。如果我们没有+
上述内容,我们需要(?![\w\pM])
避免Fe
返回FéF
实例(使用é
aseU+0301
)。
答案3
也试试
grep -o "\b[[:upper:]].*\b" file
该-o
选项将仅输出找到的匹配项,并且将\b
确保我们只考虑整个单词man grep
:
符号 \b 匹配单词边缘的空字符串
答案4
这对我有用,也可能对你有帮助:
for i in $(cat file); do [[ $i =~ ^[A-Z].[a-z]+$ ]] && echo $i; done