2009-11-01 4 views
1

Мне нужно отфильтровать все строки со словами, начинающимися с буквы, за которой следуют ноль или более букв или цифр, но никаких специальных символов (в основном имен, которые могут использоваться для переменной C++).Регулярное выражение Сценарий оболочки Unix

egrep '^[a-zA-Z][a-zA-Z0-9]*' 

Это прекрасно работает для таких слов, как «а», «AB10», но он также включает в себя такие слова, как «b.b». Я понимаю, что * в конце выражения проблема. Если я заменю * на + (один или несколько), он пропускает слова, содержащие только одну букву, поэтому это не помогает.

EDIT: Я должен быть более точным. Я хочу найти строки с любым количеством возможных слов, как описано выше. Вот пример:

int = 5; 
cout << "hello"; 
//some comments 

В этом случае он должен печатать все вышеуказанные линии, поскольку все они включают в себя по крайней мере одно слово, которое соответствует описанным условиям, и линия не должна начала с буквой.

+0

Проблема в том, что^относится к началу строки, но вас интересует любая строка, содержащая слово. Я предлагаю редактировать. – JXG

ответ

5

Ваше решение будет выглядеть примерно так, как этот пример. В этом случае регулярное выражение требует, чтобы «слову» предшествовало пробел или начало строки, а затем пробел или конец строки. При необходимости вам потребуется изменить граничные требования (скобки).

'(^|)[a-zA-Z][a-zA-Z0-9]*(|$)' 
+0

Это именно то, что я искал. Большое спасибо!!! – Mike55

1

Предполагая, что линия заканчивается после того, как слова:

'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$' 
+0

Я не знал, что вы можете использовать «ИЛИ» с регулярным выражением. Это делает его намного проще. Благодарю. – Mike55

0

Вы должны добавить что-то к нему. Возможно, остальная часть может быть белым, или вы можете просто добавить конец строки (AFAIR это было $)

0

Ваша проблема заключается в ^ и $ якорями, которые соответствуют начало и конец строки соответственно. Вы хотите, чтобы линия, чтобы соответствовать, если она содержит слово, избавившись от якорей делает то, что вы хотите:

egrep '[a-zA-Z][a-zA-Z0-9]+' 

Обратите внимание на + матчи слов длины 2 и выше, то * в этом месте будет signel символов слишком ,