2013-08-27 29 views
2

我希望有一個Perl的正則表達式從以下輸出grep的一句話開始:Perl的正則表達式到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唯一一款有許多類似的話IPS7而不是開始_

我用下面的正則表達式IPS\d+\d*$但這將用grep與_

開始的話

我該如何指定!不是_

+0

@ZaI我們是否處於編輯戰?我拿出所有的雙倍間距,你把它放回去! – Barmar

+0

@Barmar:看起來我們遇到了競爭條件:)。無論如何,它不會影響問題或答案。 – Zaid

回答

2

使用\b正則表達式運算符來匹配單詞邊界:

\bIPS\d+$ 
+0

這是一個工作,謝謝隊友 – doubando

1

您可以使用一個否定的字符類:

[^_]IPS\d+$ 

注意,在你原來的正則表達式第二\d是多餘的,因爲\d+將是貪婪。

+0

感謝提示 – doubando

0

regex之前添加此它將查找單詞邊界,仍然沒有結果之前IPS

(?<=\b) 

所以你包括最終正則表達式看起來像

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

'\ b'已經是一個零寬度的斷言,所以它不必被放置在一個倒序。 – amon

0

只需要捕獲從IP開始。

請使用下面的正則表達式。

(^ IPS \ d +)$

4

您正在嘗試解析的Windows dir命令,我假設輸出是從您嘗試在目錄中列出文件。你應該知道,這不是一個很好的方法來完成,我會告訴你一些選擇。正則表達式的答案已經給出了,所以我不會爲此而煩惱。

使用glob, <...>,這幾乎模擬了shell如何擴展通配符。

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。