web-dev-qa-db-ja.com

RegExで文字列内の特定のテキストの後の数字を検索する

次のような複数行の文字列があります。

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. "(.?)":"

ヒントはありますか?

11
Patric

この表現を試してください:

"Error importing row no\. (\d+):"

[〜#〜] demo [〜#〜]

ここでは、数量詞とエスケープシーケンスを理解する必要があります。

  • .任意の文字。数値のみが必要な場合は、\dを使用してください。ピリオド文字を意味する場合は、バックスラッシュでエスケープする必要があります(\.
  • ?ゼロまたは1文字。これはあなたが望むものではありません、あなたはここで10行目のエラーをすることができ、「1」だけを取るでしょう
  • + 1つまたは複数。これで十分です
  • *任意の文字数。入力全体を消費する可能性があるため、.*でこれを使用する場合は注意が必要です
16
Rubens Farias

かなり簡単です。今、あなたの引用はあなたが書いた正規表現でエラーを引き起こすでしょう。代わりにこれを試してください:

$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
}
1
SomeShinyObject

ここには複数の方法がありますが、以下に示すいくつかの簡単な方法が役立つ可能性があります:-

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/'
0
Lalit Somnathe