J'essaie d'analyser un fichier texte particulier. Une partie du fichier est la suivante: dans PowerShell, il s'agit actuellement d'un fichier c: \ temp \ logiciel.txt. J'essaie de l'obtenir pour renvoyer toutes les lignes entre "hotfix" et "applications:" (Comme il peut y avoir plus à l'avenir.) P> Ma commande actuelle ressemble à ceci: p> Autre regex J'ai essayé: p>
3 Réponses :
Je pense modificateur de regex Depuis que vous avez utilisé Alternativement, le .NET sans une non-regex, alternative pourrait utiliser un Select-String CODE> fournira de meilleurs résultats ici: s code> est utilisé parce que vous attendez le . code> caractère pour correspondre potentiellement aux caractèresWLINE. Le modificateur de regex m code> est utilisé de sorte que la fin de la chaîne $ code> et début de chaîne ^ code> peut être assortie sur chaque ligne. Ensemble cette syntaxe est (? Sm) code> dans PowerShell. P> où {$ _ -match ...} code> retournera tout ce qui rend la condition réelle . Depuis que vous passez une sortie code> Contenu code>, tout le contenu du fichier sera une chaîne et la chaîne entière sera donc sortie sur une condition true code>. P> -Match code> ici contre une seule chaîne, tous les matchs réussis seront stockés dans la variable code> code> automatique. Votre chaîne correspondante serait disponible dans $ matchs [0] code>. Si vous attendiez plusieurs matchs, -match code> ne fonctionnera pas comme construit ici. P>
correspond à () code> méthode de La classe de regex, peut également faire le travail: p> couper () code>, vous auriez besoin de comprendre votre nouvelle ligne de caractère: p>
commutateur code> instruction. P> switch -File Software.txt -Regex {
'HotFix\s*$' { $Hotfix,$Applications = $true,$false }
'^Applications:' { $Applications = $true }
default {
if ($Hotfix -and !$Applications) {
$_
}
}
}
Si vous lisez le fichier dans une chaîne, l'expression régulière suivante lira les lignes d'intérêt: Demo P> La regex se lit comme suit: P> Match zéro ou plus de caractères, paresseusement ( Le drapeau Je ne serais pas enclin à utiliser une regex pour cette tâche. Pour un, tout le fichier doit être lu dans une chaîne, ce qui pourrait être problématique (Memory-Wise) si le fichier est suffisamment grand. Au lieu de cela, je voudrais simplement lire le fichier ligne-ligne, en gardant uniquement la ligne actuelle en mémoire. Une fois que la ligne "Bad Fix" a été lue, enregistrez les lignes suivantes jusqu'à ce que la ligne "Applications:" est lue. Ensuite, après la fermeture du fichier, vous avez terminé. P> p>
? code>), précédé de la chaîne "hotfix \ n" code> et suivi de la chaîne "\ NAPPLICATIONS:" code>. p>
blockQquote> (? <= hotfix \ n) code> est un lookefeded em>; (? = \ Napplications :) code> est un lookahead positif em>. p> s code> ( / s < / code>) cause . *? code> pour continuer après les extrémités des lignes. (Certaines langues ont un drapeau différent qui a le même effet.) P> . *? Code> (correspondance paresseux) est utilisé à la place de . * Code> ( Match gourmand) Dans le cas où il y a plus d'une ligne suivant la ligne "Hot Fix" CODE> LIGNE qui commence "Applications:" code>. La version paresseuse correspondra au premier; La version gourmande, la dernière. P>
Au lieu d'utiliser des surveillants de recherche, vous pouvez utiliser un groupe de capture
première correspondance de la ligne qui se termine par Explication forte> < / p> REGEX DEMO P> Hotfix code>. Ensuite, capturez le groupe 1 toutes les lignes suivantes qui ne commencent pas avec les applications, puis correspondent aux applications code> p>
^. * \ bhotfix \ r? \ n code> correspond à la ligne qui se termine par hotfix li>
( code> capture groupe 1 fort>
(?: code> groupe de capture
(?! Applications :). * \ r? \ n code> Faites correspondre toute la ligne si elle ne démarre pas par Applications: CODE> LI>
ul> li>
) + code> Fermer le groupe non capturant et répétez 1 fois plus de temps pour correspondre à toutes les lignes li>
ul> li>
) code> Fermer le groupe 1 LI>
Applications: code> correspondez littéralement li>
ul>
Ne serait-il pas plus facile de rechercher les lignes commençant par
installées code> etd'applications: code> et prenant toutes les lignes entre?Quel était exactement le problème avec toutes les regextes que vous avez essayées?