如何grep包含一个可选单词?

Cod*_*lue 14 grep

我使用以下grep查询来查找VB源文件中的函数的出现.

    grep -nri "^\s*\(public\|private\|protected\)\s*\(sub\|function\)" formName.frm
Run Code Online (Sandbox Code Playgroud)

匹配 -

    Private Sub Form_Unload(Cancel As Integer)
    Private Sub lbSelect_Click()
    ...
Run Code Online (Sandbox Code Playgroud)

然而,它错过了像 -

   Private Static Sub SaveCustomer()
Run Code Online (Sandbox Code Playgroud)

因为那里附加了"静态"字样.如何在grep查询中考虑这个"可选"字?

Fat*_*ror 18

你可以用a \?做一些可选的东西:

grep -nri "^\s*\(public\|private\|protected\)\s*\(static\)\?\s*\(sub\|function\)" formName.frm
Run Code Online (Sandbox Code Playgroud)

在这种情况下,包含字符串"static"的前一组是可选的(即可以发生0或1次).

  • @CodeBlue是文字?。当您以这种方式调用`grep`时,它会使用BRE(基本正则表达式)。在BRE中,您需要转义许多“高级”表达式的元字符。如另一个答案中所述,如果您通过了-E,那么您就不必转义它(实际上,转义它会使它与文字?匹配!)。 (2认同)

Ski*_*tol 6

使用grep时,基数明智:

* : 0 or many
+ : 1 or many
? : 0 or 1 <--- this is what you need.
Run Code Online (Sandbox Code Playgroud)

考虑下面的例子(其中非常字代表了你的静态):

I am well
I was well
You are well
You were well
I am very well
He is well
He was well
She is well
She was well
She was very well
Run Code Online (Sandbox Code Playgroud)

如果我们只想要

I am well
I was well
You are well
You were well
I am very well
Run Code Online (Sandbox Code Playgroud)

我们会用'?' (还要注意在"非常"之后仔细放置空格,我们要求'非常'字为零或一次:

egrep "(I|You) (am|was|are|were) (very )?well" file.txt
Run Code Online (Sandbox Code Playgroud)

正如你猜测的那样,我邀请你使用egrep而不是grep(你可以尝试grep -E,用于扩展正则表达式).