3

必要なのは
、行全体を削除する必要がありますが、一致する文字列を保持する必要があるということです。

Unhandledで始まり、で終わるマッチングパターン:

一致するパターンを出力する以下のコードを試しましたが、ファイルから余分な行を削除する必要があります。

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

以下はサンプル入力です。

2012-04-09 01:52:13,717 --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 ; subpopdd = yes; _msuuid_1690zlm11992 = FCC09820-3004-413A-97A3-1088EE128CE9; _we_wk_ls _ =%7Btime%3A'1322900804422'%7D; _msuuid_lf2uu38ua0 = 08D1CEFE-3C19-4B9E-8096 = 1; __utmb = 1.7.10.1333916263;'wsgi.file_wrapper':、'HTTP_ACCEPT_ENCODING':'gzip、deflate'}

4

4 に答える 4

1

あなたが与えたコードはすでに要求された振る舞いを提供しています。

とは言うものの、あなたが排除できるあなたのプログラムには巨大な冗長な文字列があります。

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

最後に、ファイル全体を丸呑みすることは完全に不必要に思えます。

perl -nE'say $1 if /(Unhandled error at .*?):/g' filename
于 2012-04-09T09:41:58.850 に答える
0

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

文字列内に複数の一致がある場合、最も簡単な方法は、一致を一時的に配列に格納することです。次に、元の変数が不要になった場合は、元の変数を破棄します。

于 2012-04-09T09:10:50.523 に答える
0

オプションを使用-lして行末を処理し(バージョンに依存せず、一致ごとに新しい行を出力します)、forループを使用して最初の一致だけでなくすべての一致を出力します$1。でファイルを丸呑みする必要はありません-0777

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

/g修飾子を使用すると、キャプチャ括弧は不要であることに注意してください。

1つ(最初の)一致のみを印刷する場合/gは、冗長であり、次を使用できます$1

perl -nlwe 'print $1 if /(Unhandled error at .*?):/'
于 2012-04-09T11:53:39.383 に答える
0
perl -0777 -i -pe 's/.*?(Unhandled error .*?):.*/$1/g' filename

これにより、エラーブロックがファイル内の一致する文字列に置き換えられます。

-0777:Perlにファイル全体を一度に読み取るように強制します。
-i:ファイルのインプレース編集を意味します。
-p:は、ファイルの内容を1行ずつループし、コードを一重引用符で囲んで実行し、オプション's/.*?(Unhandled error .*?):.*/$1/g'を使用してファイルに書き戻される結果(一致した文字列)を出力することを意味し-iます。
-e:コマンドライン用

于 2012-04-09T12:39:40.577 に答える