Подтвердить что ты не робот

Как grep включить необязательное слово?

Я использую следующий grep-запрос для поиска вхождений функций в исходном файле VB.

    grep -nri "^\s*\(public\|private\|protected\)\s*\(sub\|function\)" formName.frm

Это соответствует -

    Private Sub Form_Unload(Cancel As Integer)
    Private Sub lbSelect_Click()
    ...

Однако он пропускает функции типа -

   Private Static Sub SaveCustomer()

из-за дополнительного слова "Static". Как объяснить это "необязательное" слово в grep-запросе?

4b9b3361

Ответ 1

Вы можете использовать \?, чтобы сделать что-то необязательное:

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

В этом случае предыдущая группа, содержащая строку "статический", является необязательной (то есть может встречаться 0 или 1 раз).

Ответ 2

При использовании grep, мощности:

* : 0 or many
+ : 1 or many
? : 0 or 1 <--- this is what you need.

В следующем примере (где слово очень обозначает статический):

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

Если мы хотим только

I am well
I was well
You are well
You were well
I am very well

мы будем использовать '?' (также обратите внимание на тщательное размещение пространства после "очень", чтобы упомянуть, что нам нужно "очень" слово "нуль" или один раз:

egrep "(I|You) (am|was|are|were) (very )?well" file.txt

Как вы уже догадались, я приглашаю вас использовать egrep вместо grep (вы можете попробовать grep -E, для Extended Regular Выражения).