次のような複数行の文字列があります。
2012-15-08 07:04 Bla bla bla blup
2012-15-08 07:05 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:05 Another text that I don't want to search...
2012-15-08 07:06 Another text that I don't want to search...
2012-15-08 07:06 *** Error importing row no. 5: The import of this line failed because bla bla
2012-15-08 07:07 Import has finished bla bla
私が欲しいのは、RegularExpression(PowerShellを使用)を使用して、エラーのあるすべての行番号を抽出することです。したがって、「*** Error importing row no。」と次の「:」の間の番号を見つける必要があります。これにより、常に行番号が得られます。
他にもさまざまなRegExの質問を検討しましたが、正直なところ、答えは中国語のようです。
http://regexr.com/ を使用してRegExを構築しようとしましたが、これまでのところ、たとえば次のパターンでは成功していません。
"Error importing row no. "(.?)":"
ヒントはありますか?
この表現を試してください:
"Error importing row no\. (\d+):"
ここでは、数量詞とエスケープシーケンスを理解する必要があります。
.
任意の文字。数値のみが必要な場合は、\d
を使用してください。ピリオド文字を意味する場合は、バックスラッシュでエスケープする必要があります(\.
)?
ゼロまたは1文字。これはあなたが望むものではありません、あなたはここで10行目のエラーをすることができ、「1」だけを取るでしょう+
1つまたは複数。これで十分です*
任意の文字数。入力全体を消費する可能性があるため、.*
でこれを使用する場合は注意が必要ですかなり簡単です。今、あなたの引用はあなたが書いた正規表現でエラーを引き起こすでしょう。代わりにこれを試してください:
$LogText = ""#Your logging stuff
[regex]$Regex = "Error importing row no\. ([0-9]*):"
$Matches = $Regex.Matches($LogText)
$Matches | ForEach-Object {
$RowNum = $_.Groups[1].Value #(Waves hand) These are the rows you are looking for
}
ここには複数の方法がありますが、以下に示すいくつかの簡単な方法が役立つ可能性があります:-
Temp.txtというファイルにログを記録しました。
cat temp.txt | grep " Error importing row no." | awk -F":" '{print $2}' | awk -F"." '{print $2}'
OR
cat temp.txt | grep " Error importing row no." | sed 's/\(.*\)no.\(.*\):\(.*\)/\2/'