Question
capturer un bloc au lieu d'un ligne
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
il y a 15 ans 3 mois #8264
par jojo
capturer un bloc au lieu d'un ligne a été créé par jojo
Bonjour les PowerShelleurs 
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
, mais qui sait..
merci
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
merci
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 15 ans 3 mois #8267
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:capturer un bloc au lieu d'un ligne
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
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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 3 mois #8269
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:capturer un bloc au lieu d'un ligne
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]
[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.
- Jacques Barathon
- Hors Ligne
- Administrateur
-
Réduire
Plus d'informations
- Messages : 576
- Remerciements reçus 0
il y a 15 ans 3 mois #8270
par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:capturer un bloc au lieu d'un ligne
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
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.
- jojo
-
Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 187
- Remerciements reçus 0
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 
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
<br><br>Message édité par: jojo, à: 10/12/10 07:48
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
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 15 ans 3 mois #8279
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:capturer un bloc au lieu d'un ligne
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]
@\"
kkn,dflknfdklndf
MS45554555
mjkgmknjg54544354sfd
### DEBUT ###
712T5656585
### FIN ###
5526585
### DEBUT ###
1255215
7554z56565
YES1145
###FIN###
KDKLKFLKFKLF
\"@ > \"$env:temp\data.txt\"
$BaliseDebutDeGroupe=\"Debut\"
$BaliseFinDeGroupe=\"Fin\"
[string[]] $file = gc \"$env:temp\data.txt\"
#$file|Where { $_-notmatch \"(Debut|Fin)\"}
$file|Where { $_-notmatch \"($BaliseDebutDeGroupe|$BaliseFinDeGroupe)\"}
[/code:1]
[code:1]
@\"
kkn,dflknfdklndf
MS45554555
mjkgmknjg54544354sfd
### DEBUT ###
712T5656585
### FIN ###
5526585
### DEBUT ###
1255215
7554z56565
YES1145
###FIN###
KDKLKFLKFKLF
\"@ > \"$env:temp\data.txt\"
$BaliseDebutDeGroupe=\"Debut\"
$BaliseFinDeGroupe=\"Fin\"
[string[]] $file = gc \"$env:temp\data.txt\"
#$file|Where { $_-notmatch \"(Debut|Fin)\"}
$file|Where { $_-notmatch \"($BaliseDebutDeGroupe|$BaliseFinDeGroupe)\"}
[/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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- capturer un bloc au lieu d'un ligne