grep 相当于 kwrite 正则表达式 [AZ][AZ]+

ixt*_*lix 2 grep text-processing regular-expression kwrite

所以,我花了年龄,但我终于学会了思考正则表达式,由于在使用它们的方面kwrite

但我仍然不知道如何将这些知识翻译成grep. 我爱我的grep,当我知道我在做什么时,但手册总是让我头疼。

我想匹配以下几行:

大写换行。
CAPI
TALSFOLL欠款
新线。

即,以两个或多个大写字母开头的行。但我无法弄清楚如何。

在 中kwrite,我将使用以下方法匹配这些行:

\n[A-Z][A-Z]+
Run Code Online (Sandbox Code Playgroud)

但是grep……嗯。我有一种感觉就像它是这样的:

me@ROOROO:~/$ grep "^[A-Z]something" filename
Run Code Online (Sandbox Code Playgroud)

me@ROOROO:~/$ grep "^[A-Z][A-Z]+" filename
Run Code Online (Sandbox Code Playgroud)

不起作用(返回一个空文件)。谷歌搜索“grep 匹配一次或多次出现”这个词让我相信

me@ROOROO:~/$ grep "^[A-Z][A-Z]*" filename
Run Code Online (Sandbox Code Playgroud)

是正确的语法。但是,唉,这并不能解决问题。

Mic*_*zek 8

您在第一个示例中使用了正确的语法;问题是+只有在使用“扩展”正则表达式时才被认为是特殊的。从 GNU 实现的手册页grep

基本与扩展正则表达式

在基本的正则表达式中,元字符 ?、+、{、|、( 和 ) 失去了它们的特殊意义;而是使用反斜杠版本 \?、\+、\{、\|、\( 和 \)。

( \?, \+, 和\|是非标准的 GNU 扩展)。

因此,您要么需要转义+(假设 GNUgrep或兼容):

$ grep "^[A-Z][A-Z]\+" filename
Run Code Online (Sandbox Code Playgroud)

使用\{1,\}GNU 的标准等价物\+

$ grep '^[A-Z][A-Z]\{1,\}' filename
Run Code Online (Sandbox Code Playgroud)

甚至在这里:

$ grep '^[A-Z]\{2,\}' filename
Run Code Online (Sandbox Code Playgroud)

或打开扩展正则表达式,通过传递grep-E标志或只是运行egrepegrep是介绍,在70年代后期的扩展正则表达式的命令):

$ grep -E "^[A-Z][A-Z]+" filename
$ egrep "^[A-Z][A-Z]+" filename
Run Code Online (Sandbox Code Playgroud)

在任何情况下,所有这些在功能上都等同于:

$ grep '^[A-Z][A-Z]' filename
Run Code Online (Sandbox Code Playgroud)

所以你甚至不需要+操作员。

在您的另一个示例中,您尝试过:

$ grep "^[A-Z][A-Z]*" filename
Run Code Online (Sandbox Code Playgroud)

*适用于基本的正则表达式,但它匹配 0 次或更多次,而不是 1 次或更多次。您的答案中的解决方案有效,因为它说“匹配一个大写字母,然后匹配另一个大写字母,然后是 0 个或多个大写字母”。问题中的方法说“匹配一个大写,然后1个或多个大写”,这是相同的。您还可以使用{min,max}来指定您想要的确切数量,如果您省略max它,则允许任何数量(这也需要扩展正则表达式):

$ egrep "^[A-Z]{2,}"
Run Code Online (Sandbox Code Playgroud)

(作为历史记录,最初egrep不支持{min,max}/bin/egrep例如在 Solaris 11 中仍然不\{min,max\}支持)。在添加到grep之前{min,max}添加了支持egrep(在这种情况下egrep确实破坏了向后兼容性))。