0
votes

MultiLine Regex Lookebewind omettant dans PowerShell

J'essaie d'analyser un fichier texte particulier. Une partie du fichier est la suivante: xxx

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.)

Ma commande actuelle ressemble à ceci: XXX

Autre regex J'ai essayé: xxx


2 commentaires

Ne serait-il pas plus facile de rechercher les lignes commençant par installées et d'applications: et prenant toutes les lignes entre?


Quel était exactement le problème avec toutes les regextes que vous avez essayées?


3 Réponses :


0
votes

Je pense Select-String CODE> fournira de meilleurs résultats ici: xxx pré>

modificateur de regex 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>

Depuis que vous avez utilisé -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>


Alternativement, le .NET correspond à () code> méthode de La classe de regex, peut également faire le travail: p> xxx pré>

sans couper () code>, vous auriez besoin de comprendre votre nouvelle ligne de caractère: p> xxx pré>


une non-regex, alternative pourrait utiliser un commutateur code> instruction. P>

switch -File Software.txt -Regex {
    'HotFix\s*$' { $Hotfix,$Applications = $true,$false }
    '^Applications:' { $Applications = $true }
    default {
        if ($Hotfix -and !$Applications) {
            $_
        }
    }
}


0 commentaires

0
votes

Si vous lisez le fichier dans une chaîne, l'expression régulière suivante lira les lignes d'intérêt: xxx

Demo

La regex se lit comme suit:

Match zéro ou plus de caractères, paresseusement (? ), précédé de la chaîne "hotfix \ n" et suivi de la chaîne "\ NAPPLICATIONS:" .

(? <= hotfix \ n) est un lookefeded ; (? = \ Napplications :) est un lookahead positif .

Le drapeau s ( / s < / code>) cause . *? pour continuer après les extrémités des lignes. (Certaines langues ont un drapeau différent qui a le même effet.)

. *? (correspondance paresseux) est utilisé à la place de . * ( Match gourmand) Dans le cas où il y a plus d'une ligne suivant la ligne "Hot Fix" LIGNE qui commence "Applications:" . La version paresseuse correspondra au premier; La version gourmande, la dernière.

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é.


0 commentaires

0
votes

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 Hotfix . Ensuite, capturez le groupe 1 toutes les lignes suivantes qui ne commencent pas avec les applications, puis correspondent aux applications xxx

Explication < / p>

  • ^. * \ bhotfix \ r? \ n correspond à la ligne qui se termine par hotfix
  • ( capture groupe 1
    • (?: groupe de capture
      • (?! Applications :). * \ r? \ n Faites correspondre toute la ligne si elle ne démarre pas par Applications:
      • ) + Fermer le groupe non capturant et répétez 1 fois plus de temps pour correspondre à toutes les lignes
      • ) Fermer le groupe 1
      • Applications: correspondez littéralement

        REGEX DEMO

        Entrez la description de l'image ici


0 commentaires