0

正規表現が一致するたびに結果を返すことができるスクリプトを書きたいと思います.私が推測する正規表現を書くのにいくつかの困難があります.

私の入力ファイルの内容は以下の通りです:

 Number a123;
     Number b456789 vit;
 alphabet fty;

a123 と b456789 の結果が返されることを望みます。これは、"Number" の後 ("\s" または ";") の前の文字列です。以下のコマンドラインで試しました:

 my @result=grep /Number/,@input_file;
 print "@results\n";

得られた結果を以下に示します。

  Number a123;
     Number b456789 vit;

予想される結果は次のようになります。

a123
b456789

誰でもこれについて助けることができますか?

4

3 に答える 3

3

Perlsgrep関数は、特定の条件に一致するリストからすべての要素を選択/フィルタリングします。あなたの場合、配列/Number/から正規表現に一致するすべての要素を選択しました。@input_file

Numberこの正規表現を使用した後に非空白文字列を選択するには、次のようにします。

my $regex = qr{
  Number     # Match the literal string 'Number'
  \s+        # match any number of whitespace characters
  ([^\s;]+)  # Capture the following non-spaces-or-semicolons into $1
             # using a negated character class
}x;          # use /x modifier to allow whitespaces in pattern
             # for better formatting

私の提案は、入力ファイルハンドルを直接ループすることです。

while(defined(my $line = <$input>)) {
  $line =~ /$regex/;
  print "Found: $1" if length $1; # skip if nothing was found
}

配列を使用する必要がある場合は、foreach-loopを使用することをお勧めします。

foreach my $line (@input_lines) {
  $line =~ /$regex/;
  print "Found: $1" if length $1; # skip if nothing was found
}

一致を直接出力せずに配列に格納する場合はpush、ループ内の配列に値を格納するか(両方とも機能します)、map関数を使用します。map関数は、各入力要素を指定された操作の値に置き換えます。

my @result = map {/$regex/; length $1 ? $1 : ()} @input_file;

また

my @result = map {/$regex/; length $1 ? $1 : ()} <$input>;

ブロック内mapで、正規表現を現在の配列要素と照合します。一致するものがある場合はを返し$1、そうでない場合は空のリストを返します。これは不可視に平坦化されるため、にエントリを作成しません@resultundefこれは、配列にundef要素を作成するものを返す別の形式です。

于 2012-09-04T03:46:25.193 に答える
2

スクリプトが単純なフィルターとして意図されている場合は、次を使用できます。

$ cat FILE | perl -nle 'print $1 if /Number\s+([^\s;]+)/'

また

$ cat FILE | perl -nle 'for (/Number\s+([^\s;]+)/g) { print }'

同じ行に複数のオカレンスが存在する可能性がある場合。

于 2012-09-04T03:44:35.663 に答える
0
perl -lne 'if(/Number/){s/.*\s([a-zA-Z])([\d]+).*$/\1\2/g;print}' your_file

以下でテスト:

> cat temp
Number a123;
 Number b456789 vit;
 alphabet fty;


> perl -lne 'if(/Number/){s/.*\s([a-zA-Z])([\d]+).*$/\1\2/g;print}' temp
a123
b456789
> 
于 2012-09-04T09:03:17.403 に答える