0

サンプルファイル TEST.txt に示すようなファイルがあります

TEST.txt
top.s.1 { i go to home >85

jungle.lion and city }

dog7.1.e {dalmition <101

white and black }

cars_1.3.bmw_r { very good car =10

merc is merc.r.5_two } 

「.」が 2 つある単語/フィールドで始まる行を抽出したい。. 出力例は、OUT.txt に示すとおりです。

OUT.txt
 top.s.1 { i go to home >85
 dog7.1.e {dalmition <101
 cars_1.3.bmw_r { very good car =10

この正規表現を使用して抽出しようとしました

perl -ne '/^\w+.*?\.\w\.\d+.*?/ig && print' TEST.txt > OUT.txt

いくつかの表現に一致しませんでした。誰でも希望を得るのを手伝ってもらえますか??

注:これは単なるサンプル入力ファイルであるため、このワンライナーはこれで機能する可能性がありますが、元のファイルのすべての文字列を見つけるのに十分な精度ではありません.

4

4 に答える 4

2

あなたの正規表現は、英数字の文字列の後に任意の長さの文字列、次にドット、単一の英数字、別のドット、次にいくつかの数字、そして何か/^\w+.*?\.\w\.\d+.*?/igが続くことを期待しています。パターンにアルファ文字がないため、修飾子は不要です。また、一致できるのは 1 回のみであるため、修飾子は不要です。/i/g/^/

を削除して.*?と を に変更すると\w、動作するはずです。\d+\w+

これにより、必要なことが行われます。コマンドラインパラメータとして入力ファイルが必要です

use strict;
use warnings;

while (<>) {
  print if /^\w+\.\w+\.\w+[^\w.]/;
}

またはコマンドライン プログラムとして:

perl -ne 'print if /^\w+\.\w+\.\w+[^\w.]/' TEST.txt
于 2012-08-23T09:54:18.503 に答える
0

あなたの主な目標がブロックの「ヘッダー」をチェックすることである場合、最初にヘッダーとブロックをハッシュに解析することは良い考えだと思います。その後、.必要に応じて期間のハッシュキーを確認できます。

> perl -MData::Dumper -nlwe 'if (/^\s*([\w.]+)\s*({\s*.*)/) { 
    $key = $1; $a{$key} = $2;
    } else { 
    $a{$key} .= $_ } }{ print Dumper \%a;' data.txt

出力:

$VAR1 = {
      'cars_1.3.bmw_r' => '{ very good car =10merc is merc.r.5_two } ',
      'top.s.1' => '{ i go to home >85jungle.lion and city }',
      'dog7.1.e' => '{ dalmition <101white and black }'
};

キーの後処理は次のようになります。

@keys = grep /\..*\./, keys %a;   # 2 or more periods
@keys = grep /^[^.]*\.[^.]+\.[^.]*$/, keys %a;  # exactly 2 periods

視覚効果のオプションを使用してブロックから改行を削除することを選択しましたが、改行を-l残す必要があると思われる場合は-l、コマンドラインスイッチから削除するだけです。

于 2012-08-23T11:04:23.460 に答える
0

awk:

awk '{if ($1 ~ /.*\..*\..*/) {print}}' TEST.txt

テストは、最初のフィールドで目的のパターンをチェックします

于 2012-08-23T09:43:39.363 に答える
-1

次の正規表現を使用します。

perl -ne 'print if /^[^ .]*\.[^ .]*\./'

つまり、行の先頭には、スペースでもドットでもないものでも、何もないものでもかまいません。その場合は、スペースまたはドット以外のものよりも、ドットがあり、さらにドットがあります。

于 2012-08-23T09:51:41.370 に答える