4 votes

Chaîne de recherche Powershell pour un tableau de motifs

En Powershell, comment rechercher chaque ligne d'un fichier texte dans un tableau de motifs ? Le motif de Select-string peut accepter un tableau, mais il renvoie une valeur vraie si l'une des chaînes du tableau est trouvée. J'ai besoin qu'il renvoie la valeur vraie (ou effectivement les lignes) si TOUTES les chaînes du tableau sont trouvées dans la ligne. Merci.

3voto

Ansgar Wiechers Points 38466

Pour faire correspondre un tableau de chaînes de caractères à un tableau de motifs, je pense que vous avez besoin de quelque chose comme ceci :

$patterns = @( ... )

Get-Content sample.txt | % {
  $count = 0
  foreach ($p in $patterns) {
    if ($_ -match $p) { $count++ }
  }
  if ($count -eq $patterns.Length) { $_ }
}

ou comme ça :

$patterns = @( ... )

$content = Get-Content sample.txt
foreach ( $line in $content ) {
  $count = @($patterns | ? { $line -match $_ }).Length
  if ( $count -eq $patterns.Length ) { $line }
}

2voto

Shay Levy Points 41404

Du haut de ma tête

Get-Content file.txt | 
Where-Object {$_ -match $ptrn1 -and $_ -match $ptrn2 -and $_ -match $ptrn3}

1voto

mjolinor Points 23012

Quelques autres possibilités :

$patterns = 'abc','def','ghi'
$lines = 'abcdefghi','abcdefg','abcdefghijkl'

:nextline foreach ($line in $lines)
 {foreach ($pattern in $patterns)
  {if ($line -notmatch $pattern){continue nextline}
 }$line}

abcdefghi
abcdefghijkl

Cela permet d'abandonner la poursuite du traitement d'une ligne dès que l'un des motifs ne correspond pas.

Cela fonctionne sur l'ensemble de la collection de lignes en une seule fois, plutôt que de faire un foreach :

$patterns = 'abc','def','ghi'
$lines = 'abcdefghi','abcdefg','abcdefghijkl'

foreach ($pattern in $patterns)
{$lines = $lines -match $pattern}
$lines

abcdefghi
abcdefghijkl

Remplacez votre get-content par les littéraux de test pour remplir $lines.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X