我有一个命令,可以打印格式为“Name:nickname”的行。但由于它是 getent 的输出,因此它还包含一些不是姓名的行。
但是,它们要么全是大写,要么全是小写,而“真实”的名字则以一个大写字母和一个小写字母开头。
我复制了此命令以仅打印以大写字母开头的行:
... | grep -P '^[^\s]+\s+[A-Z]'
现在,我应该如何扩展命令以便它也检查第二个字母并且只有当它是小写时才打印该行?
答案1
您可以使用 POSIX 括号匹配以大写字母开头且后跟至少一个小写字母的行:
... | grep '^[[:upper:]][[:lower:]]'
这不需要 PCRE(-P
)甚至扩展(-E
)正则表达式支持。
答案2
我注意到您的示例 RegEx'^[^\s]+\s+[A-Z]'
(尽管格式不正确)您甚至试图捕获那些在实际名称前以空格开头的行。如果我是对的,那么您可以'(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)'
在grep
命令中使用 RegEx,如下所示:
... | grep -P '(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)'
这将输出所有以大写字母开头且第一个单词后跟任意数量的小写字母的行,即使同一行中前面有任意数量的空格。
解释:
()
这与每个组中包含的并由或运算符分隔的任意两个组相匹配|
。
^
将从行首开始。[\s]
将匹配任何空白字符(空格、制表符、换行符)。+
将匹配前面的一个或多个字符集。[A-Z]
将匹配一个大写字母。[a-z]+
将匹配一个或多个小写字母。
注意:
您可能想要删除输出行中的前一个空格。在这种情况下,将输出通过管道传输到类似的工具sed
,并将其与将从行首开始并匹配一个或多个连续空格一起使用sed 's/^ *//'
,^ *
然后它将被删除。像这样使用它:
... | grep -P '(^[\s]+[A-Z][a-z]+)|(^[A-Z][a-z]+)' | sed 's/^ *//'