Регулярное выражение сценария оболочки Unix - PullRequest
1 голос
/ 01 ноября 2009

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

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

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 01 ноября 2009

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

'(^| )[a-zA-Z][a-zA-Z0-9]*( |$)'
1 голос
/ 01 ноября 2009

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

'^[a-zA-Z][a-zA-Z0-9]+|^[a-zA-Z]$'
0 голосов
/ 01 ноября 2009

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

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

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

0 голосов
/ 01 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...