Почему это простое регулярное выражение не соответствует тому, что, я думаю, должно? - PullRequest
4 голосов
/ 06 апреля 2010

У меня есть файл данных, который выглядит как в следующем примере. Я добавил «%» вместо \t, символа управления вкладками.

1234:56%  Alice Worthington
alicew%   Jan 1, 2010 10:20:30 AM%  Closed%   Development
Digg:
Reddit:
Update%%  file-one.txt%   1.1%      c:/foo/bar/quux
Add%%     file-two.txt%   2.5.2%    c:/foo/bar/quux
Remove%%  file-three.txt% 3.4%      c:/bar/quux
Update%%  file-four.txt%  4.6.5.3%  c:/zzz

... many more records of the above form

Интересующие меня записи - это строки, начинающиеся с «Обновить», «Добавить», «Удалить» и т. Д. Я не буду знать, с чего строки начинаются раньше или сколько строк предшествует им. Я знаю, что они всегда начинаются со строки букв, за которыми следуют две вкладки. Итак, я написал это регулярное выражение:

generate-report-for 1234:56 | egrep "^[[:alpha:]]+\t\t.+"

Но это соответствует нулю строк. Где я ошибся?

Редактировать: Я получаю одинаковые результаты, использую ли я '...' или "..." для выражения egrep, поэтому я не уверен, что это оболочка.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

Очевидно, \t не является специальным символом для egrep. Вы можете использовать grep -P для включения Perl-совместимого движка регулярных выражений или вставить буквенные вкладки с помощью Ctrl v Ctrl i

Еще лучше, вы могли бы использовать превосходный Ack

0 голосов
/ 07 апреля 2010

вы можете использовать awk

awk '/^[[:alpha:]]\t\t/' file
0 голосов
/ 06 апреля 2010

Файл может быть не совсем тем, что вы видите. Может быть, есть скрытые контрольные символы. Это иногда случается. Мое предложение состоит в том, чтобы вы отладили это. Сначала уменьшите до минимума соответствующий шаблон регулярных выражений, а затем продолжайте добавлять материал по одному, пока не найдете проблему:

egrep "[[:alpha:]]" 
egrep "[[:alpha:]]+" 
egrep "[[:alpha:]]+\t" 
egrep "[[:alpha:]]+\t\t" 
egrep "[[:alpha:]]+\t\t.+" 
egrep "^[[:alpha:]]+\t\t.+" 

Существуют варианты этой последовательности в зависимости от того, что вы обнаруживаете на каждом этапе. Кроме того, первый шаг действительно можно пропустить, но это только ради демонстрации техники.

0 голосов
/ 06 апреля 2010

Похоже, что оболочка анализирует "\ t \ t" перед отправкой в ​​egrep. Попробуйте "\\ t \\ t" или "\ t \ t". Это две косые черты в двойных кавычках и одна в одинарных.

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