2013-08-27 4 views
2

Я хочу Perl регулярное выражение для Grep слова из следующего вывода:Perl Regex чтобы Grep слово начинается не с особым характером _

Process Completed;Result= Volume in drive D has no label. 

Volume Serial Number is 328A-C899 

Directory of D:\Program 

07/14/2013 12:09 PM <DIR>   . 
07/14/2013 12:09 PM <DIR>   .. 
06/16/2013 01:07 PM <DIR>   IPS 
07/14/2013 12:10 PM <DIR>   IPS1 
07/14/2013 12:12 PM <DIR>   IPS2 
07/14/2013 12:16 PM <DIR>   IPS3 
07/14/2013 01:50 PM <DIR>   IPS4 
07/14/2013 12:17 PM <DIR>   IPS5 
07/14/2013 12:17 PM <DIR>   IPS6 
07/14/2013 12:18 PM <DIR>   IPS7 
07/14/2013 12:18 PM <DIR>   IPS8 
06/16/2013 01:10 PM <DIR>   IPSCommon 
07/08/2013 12:32 PM <DIR>   _IPS10 
07/08/2013 12:32 PM <DIR>   _IPS11 
07/08/2013 12:32 PM <DIR>   _IPS12 
07/08/2013 12:32 PM <DIR>   _IPS13 
07/08/2013 12:32 PM <DIR>   _IPS14 
07/08/2013 12:57 PM <DIR>   _IPS15 
07/08/2013 12:32 PM <DIR>   _IPS16 
07/08/2013 03:38 PM <DIR>   _IPS17 
07/08/2013 12:32 PM <DIR>   _IPS18 
07/08/2013 12:32 PM <DIR>   _IPS9 
       0 File(s)    0 bytes 
       22 Dir(s) 770,968,162,304 bytes free 
  • требования является Grep только IPS слова, которые имеют ряд как IPS7 и не начиная с _

Я использовал следующее регулярное выражение IPS\d+\d*$, но это будет Grep слова, которые начинаются с _ также

Как я могу указать! не _?

+0

@ Zaid Мы находимся в режиме редактирования войны? Я вытащил все двойные интервалы, ты положил их обратно! – Barmar

+0

@ Бармар: Похоже, мы столкнулись с состоянием гонки :). В любом случае это не влияет на вопрос или ответ. – Zaid

ответ

2

Используйте оператор \b регулярное выражение, чтобы соответствовать границе слова:

\bIPS\d+$ 
+0

этот работает, спасибо mate – doubando

1

Вы можете использовать отрицание класса символов:

[^_]IPS\d+$ 

Обратите внимание, что в исходном регулярном выражении второго \d является излишним, поскольку \d+ будет жадничать.

+0

спасибо за примечание – doubando

0

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

(?<=\b) 

так что ваши конечное регулярное выражение выглядит как

(?<=\b)IPS\d+\d*$ 
+2

'\ b' уже является утверждением с нулевой шириной, поэтому его не нужно вводить в lookbehind. – amon

0

необходимо зафиксировать только «Начать с IP».

Пожалуйста, используйте указанное ниже регулярное выражение.

(^ IPS \ d +) $

4

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

Использование glob, <...>, что в значительной степени является эмуляцией того, как оболочка расширяет подстановочные знаки.

my @ips = grep /^IPS\d+/,  # only IPS with number 
      grep -d,    # only directories 
      <D:/Program/IPS*>; # list IPS file in the target dir 

Использование opendir.

opendir my $dh, "D:/Program" or die $!; 
my @ips = grep /^IPS\d+/, readdir($dh); 
closedir $dh; 

Использование File::Find. Обратите внимание, что этот вариант является рекурсивным (также список файлов в подкаталогах):

use File::Find; # core module in Perl 5 
my @ips; 
find(sub { push @ips, $File::Find::name if /^IPS\d+/ }, "D:/Program"); 

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

Смежные вопросы