2 votes

Comment sélectionner entre plusieurs lignes dans PowerShell?

Je suis en train d'utiliser Get-Content (gc) ici. J'ai besoin de supprimer un ensemble de lignes défini par le marqueur de début et de fin. Mais pour certaines raisons, la commande que j'utilise ne fonctionne pas. Savez-vous ce qui me manque ici?

Commande que j'ai essayée:

powershell -Command ((gc test.txt) -replace '"/\#start.*\#end/gms"','')

test.txt:

ligne1
ligne2
#start
ligne3
ligne4
#end
ligne5

Sortie attendue:

ligne1
ligne2
ligne5

3voto

TobyU Points 2750

Get-Content lit le fichier dans un tableau de chaînes. Utilisez Get-Content -Raw pour le lire comme une seule chaîne.

powershell -Command ((Get-Content -Path test.txt -Raw) -replace '(?smi)#start(.*)#end\r?\n','')

2voto

iRon Points 41

Tel que répondu par @TobyU, l'utilisation du -Raw résoudra facilement le problème mais il y a un inconvénient à cette solution rapide :

PowerShell est extrêmement bon pour diffuser des objets, c'est pourquoi Get-Content fournit à la base un flux de lignes. Si vous utilisez le -Raw et/ou des crochets, vous bloquez le pipeline de sortie. Ce n'est pas un gros problème pour une petite liste mais cela pourrait causer des problèmes de performance et/ou de mémoire lorsque la liste devient plus importante.

En ce qui concerne le pipeline de diffusion de PowerShell, vous pouvez envisager de le résoudre comme ceci :

$On = $True; Get-Content -Path test.txt | Where {If ($_ -eq '#start') {$On = $False} ElseIf ($_ -eq '#end') {$On = $True} Else {$On}}

Dans cette commande, Where filtre le #Start et le #End car dans les deux cas il n'y a aucune sortie et passe le reste des lignes lorsque $on est $True.

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