Perl -pe регулярное выражение - PullRequest
2 голосов
/ 10 февраля 2011

Я использую Perl для проверки ввода текста для шаблона регулярных выражений, но один шаблон не работает с perl -pe.

Следующий шаблон не работает с вызовом команды:

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!

Я использую оболочку Linux.После вызова я использую для проверки своего регулярного выражения:

cat test | perl -pe 's![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!'

Проверка файла:

A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

Результат:

A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
Cache

Как удалить первый результат?

Спасибо за любой совет.

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

Последний слэш после "Comp - (. *)" Может быть тем, что делает.Содержимое вашего файла в базе данных не имеет косой черты.Попробуйте заменить Comp-(.*)/.* на Comp-(.*)[/.].*, чтобы можно было сопоставить либо подкаталог, либо расширение файла.

2 голосов
/ 10 февраля 2011
$ cat input 
A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

$ perl -ne 'print if s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)/.*!$1!' input
Cache
1 голос
/ 10 февраля 2011

\ s соответствуют пробелам (пробелы, табуляции и разрывы строк), а '+' означает один или несколько символов. В этом случае \ s + будет означать поиск одного или нескольких пробелов.

cat test
A   MaintanceGie?\195?\159mannFlock/System/Comp-Database.cpp
A   MaintanceGie?\195?\159mannFlock/System/Comp-Cache/abc.h

perl -ne 'print "$1\n" if /\w+?\d+?\d+\w+\/\w+\/Comp-(\w+)[\/]/' test
1 голос
/ 10 февраля 2011

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

s![a-zA-Z]+ +(?:.*?)/(?:.*)Comp-(.*)[./].*!$1!

Редактировать: Обновлен для соответствия новым входным данным и добавил другую опцию:

С другой стороны, заменяющее регулярное выражение может быть заменено чем-тонапример:

perl -ne 'print "$1\n" if /Comp-(.*?)[.\/]/'

Тогда нет необходимости анализировать полную строку с тем, что в ней содержится.

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