web-dev-qa-db-fra.com

Trouver des nombres après un texte spécifique dans une chaîne avec RegEx

J'ai une chaîne multiligne comme celle-ci:

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

Ce que je veux, c'est extraire tous les numéros de ligne qui contiennent des erreurs à l'aide de RegularExpression (avec PowerShell). Je dois donc trouver le numéro entre "*** Erreur lors de l'importation du numéro de ligne" et le ":" suivant, car cela me donnera toujours le numéro de la ligne.

J'ai regardé diverses autres questions sur RegEx mais pour être honnête, les réponses sont comme des chinois pour moi.

J'ai essayé de créer RegEx avec l'aide de http://regexr.com/ mais je n'ai pas réussi jusqu'à présent, par exemple avec le motif suivant:

"Error importing row no. "(.?)":"

Des allusions?

10
Patric

Essayez cette expression:

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

DEMO

Ici, vous devez comprendre les quantificateurs et les séquences échappées:

  • . n'importe quel caractère; comme vous voulez seulement des nombres, utilisez \d; si vous vouliez dire le caractère point, vous devez l'échapper avec une barre oblique inverse (\.)
  • ? zéro ou un caractère; ce n'est pas ce que vous voulez, car vous pouvez ici une erreur sur la ligne 10 et ne prendrait que le "1"
  • + Un ou plusieurs; cela nous suffira
  • * N'importe quel nombre de caractères; vous devez faire attention lorsque vous utilisez ceci avec .* car il peut consommer toute votre entrée
11
Rubens Farias

Assez simple. Pour le moment, votre citation va causer une erreur dans la regex que vous avez écrite. Essayez ceci à la place:

$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

Il pourrait y avoir plusieurs façons, quelques simples parmi celles présentées ci-dessous pourraient aider:

J'ai pris votre journal dans un fichier appelé 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