2010-06-15 4 views

Répondre

4

Pourquoi ne pas simplement utiliser Select-String?

ls *.php | Select-String "<?php eval" 

Le motif donné à Select-String est lu comme une expression régulière. Vous pouvez faire de la correspondance de texte brut en spécifiant le simpleMatch commutateur:

ls *.php | Select-String "<?php eval" -simpleMatch 

Voici la commande pour obtenir l'aide en direct pour PowerShell expressions régulières:

get-help about_regular_expression 

EDIT:

Ah, vous didn ne spécifiez pas dans votre question que vous étiez en train de faire une opération REPLACE. C'est un peu différent, d'autant plus qu'il s'étend sur plusieurs lignes. Je suggère quelque chose comme ceci:

# Retrieve file as a single string. 
$contents = [string]::Join("`n", $(Get-Content path\to\file.php)) 

# Now replace. 
$replaced = $contents -replace '(?s)(<\?php eval\()(.*?)(\)\?>)', '$1neweval$3' 

Alors, que ce fait est à la recherche de <?php eval(, alors paresseusement (important!) À la recherche de )?>, tous en mode mono-ligne, de sorte que les nouvelles lignes sont analysées dans la partie .*?. (Barre avant les points d'interrogation et parens pour les échapper.) Il remplace alors toutes les correspondances par le groupe 1 (dans ce cas, <?php eval(), du texte, puis du groupe 3 ()?>). Vous pouvez rendre le regroupement aussi complexe que nécessaire pour collecter des informations depuis le match. En outre, parce que vous essayez d'utiliser regex pour analyser une langue, au lieu d'un analyseur de langue, il y a beaucoup de cas où cela peut aller horriblement, horriblement mal. Sachez juste, et n'obstruez pas vos fichiers tant que vous n'avez pas vérifié que la sortie est correcte.

+0

Mon script actuel utilisait regex comme ceci: | ForEach-Object {Copier-Item $ _ "$ ($ _). Bak"; (Obtenir-Contenu $ _) -réplace $ RegEx, "" Je vais testez-le en utilisant le commandlet Select-String. – MrGrant

+0

Cela ne fonctionnera pas car j'ai besoin de trouver un bloc de texte entre l'ouverture "" Je remplace ce texte par un autre texte. Le -select semble saisir seulement une ligne mais le texte s'étend sur plusieurs lignes. – MrGrant

+0

J'ai mis à jour ma réponse pour refléter votre commentaire. – jdmichal