2012-04-09 13 views
3

私が必要とするのは
私は行全体を削除する必要がありますが、一致する文字列を保持する必要があります。一致する文字列以外の行全体を削除する必要があります

パターンマッチングIは、マッチングパターンを印刷する以下のコードを試みたが、私は、ファイルから余分な行を削除する必要がUnhandled始まると:

で終わります。以下

perl -0777 -ne 'print "Unhandled error at$1\n" while /Unhandled\ error\ at(.*?):/gs' filename 

サンプル入力される:52:

2012-04-09 01 13717 - uhrerror - ERROR - 22866 - /home/shabbir/web/middleware.pyにprocess_exception - 217 -/user/resetpassword /:で未処理エラーが発生しました:{'mod_wsgi.listener_port': '8080'、 'HTTP_COOKIE': "__utma = 1.627673239.1309689718.1333823126.1333916263.156; __utmz = 1.1333636950.152.101.utmgclid = CMmkz934na8CFY4c6wod_R8JbA | utmccn =(not%20set )| utmcmd =(not%20set)| utmctr = non-stick%20kadai%20online; subpopdd = yes; _msuuid_1690zlm11992 = FCC09820-3004-413A-97A3-1088EE128CE9; _we_wk_ls _ =%7Btime%3A'1322900804422 '%7D; _msuuid_lf2uu38ua0 = 08D1CEFE-3C19-4B9E-8096-240B92BA0ADD; neve rmissadeal = True; sessionid = c1e850e2e7db09e98a02415fc1ef490; __utmc = 1; __utmb = 1.7.10.1333916263; 「wsgi.file_wrapper」:「HTTP_ACCEPT_ENCODING」:「gzipで、収縮させる」}

答えて

0
perl -0777 -i -pe 's/.*?(Unhandled error .*?):.*/$1/g' filename 

これは、ファイル内にマッチした文字列とエラーブロックに置き換えられます。

-0777:Perlにファイル全体を強制的に読み取らせます。
-i:ファイルのインプレイス編集を意味します。
-pは:即ち's/.*?(Unhandled error .*?):.*/$1/g'単一引用符内のコードを実行し、-iオプションを使用してファイルに書き戻される結果(マッチした文字列)を、印刷、ループライン・バイ・ラインファイルの内容を通ることを意味します。 -e
:コマンドライン

+0

これは "ファイルから余分な行を削除"しません。それは単に一致する行から削除します。 – ikegami

+0

@Devendra:それは私のためのトリックをした..ありがとうたくさん:) btw ..私もpythonコードでそれをした... –

+0

@ ShabbirAhmed-ようこそ:) –

0

1つの試合はあなたが全体の文字列から保持したいすべての場合は、その後の試合で文字列値を置き換えることができます。 (つまり、単に新しい値を割り当てる)

文字列内に複数の一致がある場合、最も単純な方法は、一致を一時的に配列に格納することです。それでもはや元の変数を捨てるだけです。

+0

のために私は一つだけのマッチを持っていますが、それだけでパターンが見つかった場合、ブロックを削除し、マッチングパターンを維持する必要があります。コマンドを私に説明していただけますか? –

1

あなたがすでに指定したコードは、要求された動作を提供します。

つまり、プログラムには巨大な冗長文字列があります。

perl -0777nE'say $1 while /(Unhandled error at .*?):/gs' filename 

最後に、ファイル全体をスラーピングすることは全く不要です。

perl -nE'say $1 if /(Unhandled error at .*?):/g' filename 
+0

返事をありがとう。 findを見つけたら、ブロック全体を削除して、一致したパターンを保持し、次のブロックに移動する必要があります。 P.S:perlでうまくいきません。 –

+0

@Shabbir Ahmed、どのようにブロックを定義しますか?以前、あなたは、他の行からのテキストも含めて、すべての非マシニングテキストを削除したいとしました。今あなたはいくつかのブロックについて話したいですか? – ikegami

0

私は行末を処理するために-lオプションを使用して、すべての試合だけでなく、最初の1 $1を印刷するforループ(以下バージョン依存、各マッチのための新しい行を出力します)。 -0777でファイルをスラッシングする必要はありません。

perl -nwle 'print for /Unhandled error at .*?:/g' 

修飾子が/gの場合、キャプチャ括弧は必要ありません。

は、唯一の場合は(最初の)試合は、印刷する/gは冗長であり、あなただけ$1を使用することができます。

perl -nlwe 'print $1 if /(Unhandled error at .*?):/' 
関連する問題