如何修复此正则表达式,以便它找到至少包含一个小写字母的任何单词grep -E -e '^[S][a-z]+, [^S][a-z]+' People.txt
。我使用的正则表达式是搜索以大写 S 开头的第二个名称,后跟逗号,然后是空格,然后是以 S 以外的任何字母开头的第一个名称。我想修复此正则表达式,以便它也可以找到名字是这样的SbBBB, PaUU
。我在 MacBook 的终端中使用 grep
史密斯(名字) 保罗(名字)
文本文件
Smith, Paul
SbBBB, PaUU
Pau, Smi
Smi, Smi
SA, PA
正则表达式的输出
Smith, Paul
SbBBB, PaUU
答案1
这可能就是您想要做的事情,使用任何符合 POSIX 标准的内容grep
,并假设您想要匹配除S
第二个单词开头之外的英语大写字母:
$ grep '^S[[:alpha:]]*[[:lower:]][[:alpha:]]*, [ABCDEFGHIJKLMNOPQRTUVWXYZ][[:alpha:]]*[[:lower:]][[:alpha:]]*' file
Smith, Paul
SbBBB, PaUU
答案2
$ grep -Px 'S\pL*\p{Ll}\pL*, (?!S)\p{Lu}\pL*\p{Ll}\pL*' < your-file
Smith, Paul
SbBBB, PaUU
将报告以以下开头的行,S
后跟任意数量的字母L
(带有etter rperty的字符p
),后跟 1 个小写字母,后跟任意数量的字母后面跟着", "
、 和一个大写字母,然后是S
多个字母,其中至少有一个小写字母。
PCRE\pL
与 POSIX 一样,[[:alpha:]]
不仅限于字母表中的字母;包括任何脚本的单词字符。您可以将 with 替换[\p{Ll}\p{Lu}]
为仅匹配可被视为小写或大写的字母,或者替换\p{Latin}
为 中的任何字母拉丁例如,脚本(如英语、法语、西班牙语等中使用的)以及(?=\p{Latin})\p{Ll}
仅用于拉丁语脚本中的小写字母(不适用于希腊语、西里尔语等脚本中的小写字母)。
要使用这些[a-z]
并且仅匹配 US ASCII 字符集的 26 个小写字母,您需要将语言环境修复为C
/ POSIX
,然后您甚至不需要 PCRE:
L='[A-Za-z]' Ll='[a-z]'
LC_ALL=C grep -x "S$L*$Ll$L*, [A-RT-Z]$L*$Ll$L*"
Serra, Éric
请注意,例如,它不会匹配 on,因为它在 C 语言环境中É
与 by 不匹配。[A-RT-Z]