Question capturer un bloc au lieu d'un ligne

Plus d'informations
il y a 15 ans 3 mois #8264 par jojo
Bonjour les PowerShelleurs :laugh:

j'ai une question concernant le formatage de fichiers:
quel est l'équivalent de la commande SED suivante.

[code:1]# cette commande permet de capturer des blocs de \"debutbloc\" jusqu'a \"finBloc\"

sed '/debutbloc/,/finBloc/' fichier[/code:1]

y'a t'il en PS un équivalent, ou il faut passer par un traitement ligne par ligne ?

[code:1]# voici un exemple de fichier (petite portion)
PS D:\> cat monfichier

MS45554555
### DEBUT ###
712T5656585
5456Y6
### FIN ###
5526585
### DEBUT ###
1255215
7554z56565
###FIN###
0050545404G

# La sortie devras être:
712T5656585
5456Y6
1255215
7554z56565

avec Sed c'est simple:
PS D:\> sed '/DEBUT/,/FIN/' monfichier[/code:1]

PS: Si PowerShell n'a pas une cmdlet de formatage permettant de traiter aussi les blocs..es-ce qu'il est possible de contacter l'un des developpeur PS et lui demander s'il est possible d'inclure cette option dans PS3 ?!...je sais j'exagère un peu :lol: , mais qui sait..:whistle:

merci

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8267 par Arnaud Petitjean
Salut Jojo,

Je ne suis pas un as des expressions régulières, en revanche je suis sur qu'une expression régulière \"bien taillée\" couplée avec la commandelette \"Select-String\" fera l'affaire.

Tu obtiendras le résultat des captures dans la variable automatique $Matches.

Bon courage,

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8269 par Jacques Barathon
En effet, le salut viendra des expressions régulières (et d'un peu d'huile de coude :)) :

[code:1]
PS> $regex = [regex]'(?si)(?<=\n\W+debut\W+\n)(.*?)(?=\n\W+fin\W+\n)'
PS> $text = [io.file]::readalltext(\"c:\outils\test.txt\"«»)
PS> $lines = $regex.matches($text)
[/code:1]

A la fin, $lines est un tableau dont chaque élément contient dans sa propriété Value le groupe de lignes trouvées.

[code:1]
PS> $lines | foreach {$i=0} {\"Groupe $i :\"; $_.value; $i++}
Groupe 0 :
712T5656585
5456Y6
Groupe 1 :
1255215
7554z56565
[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8270 par Jacques Barathon
Je précise que la solution ci-dessous est très perfectible. Quelques tests un peu poussés montrent vite les limites de mon expression régulière, mais ça donne une direction.

Pour plus d'infos sur les expressions régulières dans le .NET Framework (et donc dans PowerShell) :

msdn.microsoft.com/fr-fr/library/az24scfc.aspx

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8273 par jojo
Réponse de jojo sur le sujet Re:capturer un bloc au lieu d'un ligne
Bonjour les Powershelleurs, j'epere que vous allez bien :laugh:

Arnaud, janel, merci bien de votre aide, j'ai suivi vos conseils en cherchant du côté des Regexp et je suis tombé sur une expression que j'ai modifié un peu pour que ça marche dans mon exemple:

[code:1]PS D:\> cat fichier

kkn,dflknfdklndf
MS45554555
mjkgmknjg54544354sfd
### DEBUT ###
712T5656585
### FIN ###
5526585
### DEBUT ###
1255215
7554z56565
YES1145
###FIN###
KDKLKFLKFKLF

PS D:\> cat by_Arnaud_And_Janel.ps1

$file = (cat fichier.txt) -split '#'
$rex = [regex]'(?sm)DEBUT.*?(?=(FIN|\Z))'
$c=0
$rex.Matches($file) | ForEach {
++$c
\"GROUP$c`n{0}\" -f $_.value.replace(\"DEBUT\",\"\"«»).Trim()
}

PS D:\> ./by_Arnaud_And_Janel.ps1

GROUP1
712T5656585
GROUP2
1255215 7554z56565 YES1145[/code:1]

et yoooopi :woohoo:<br><br>Message édité par: jojo, à: 10/12/10 07:48

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 3 mois #8279 par Laurent Dardenne
Une autre approche, basée sur un groupe, SI les lignes ne contiennent pas les balises recherchées indiquées dans ledit groupe:
[code:1]
@\&quot;
kkn,dflknfdklndf
MS45554555
mjkgmknjg54544354sfd
### DEBUT ###
712T5656585
### FIN ###
5526585
### DEBUT ###
1255215
7554z56565
YES1145
###FIN###
KDKLKFLKFKLF
\&quot;@ &gt; \&quot;$env:temp\data.txt\&quot;

$BaliseDebutDeGroupe=\&quot;Debut\&quot;
$BaliseFinDeGroupe=\&quot;Fin\&quot;

[string[]] $file = gc \&quot;$env:temp\data.txt\&quot;
#$file|Where { $_-notmatch \&quot;(Debut|Fin)\&quot;}
$file|Where { $_-notmatch \&quot;($BaliseDebutDeGroupe|$BaliseFinDeGroupe)\&quot;}
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.053 secondes
Propulsé par Kunena