2

次の出力から単語をgrepするperl正規表現が必要です。

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
  • IPS7要件は、次のような番号を持ち、で始まらないIPS 単語のみを grep することです。_

次の正規表現を使用しましたが、これはまたIPS\d+\d*$で始まる単語をgrepします_

どのように指定できますか ! そうじゃない_

4

5 に答える 5

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");

それぞれの方法には独自の利点があります。あなたの場合、使用する最も類似した方法は、グロブを使用する一番上の方法です。

于 2013-08-27T09:10:33.907 に答える
2

\b正規表現演算子を使用して単語境界を照合します。

\bIPS\d+$
于 2013-08-27T07:42:45.617 に答える
1

否定文字クラスを使用できます。

[^_]IPS\d+$

貪欲になる\dため、元の正規表現の2番目は冗長であることに注意してください。\d+

于 2013-08-27T07:42:34.650 に答える
0

Start with IP のみをキャプチャする必要があります。

以下の正規表現を使用してください。

(^IPS\d+)$

于 2013-08-27T08:40:16.447 に答える
0

これを前に追加するregexと、単語の境界が検索されますが、前の結果には含まれませんIPS

(?<=\b)

あなたの最終的な正規表現は次のようになります

(?<=\b)IPS\d+\d*$
于 2013-08-27T07:44:31.390 に答える