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)
是正确的语法。但是,唉,这并不能解决问题。
您在第一个示例中使用了正确的语法;问题是+
只有在使用“扩展”正则表达式时才被认为是特殊的。从 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
标志或只是运行egrep
(egrep
是介绍,在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
确实破坏了向后兼容性))。