IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacer caractère de fin de ligne suivi d'une accolade


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Remplacer caractère de fin de ligne suivi d'une accolade
    Petite prise de tête cet après-midi sur le problème suivant. Soit le bloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Mesh =
    {
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
    et je veux en sortie le block suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Mesh = {
    Name = "referenced_name";                 
    File = "mesh_filename";
    Type = "msh";                            
    }
    en sachant que:
    - Il peut y avoir plusieurs blocs qui se suivent dans l'entrée
    - il peut y avoir du texte sur la ligne après la parenthèse ouvrante (ce texte doit alors rester sur une ligne seule)
    - il peut y avoir des blancs (espaces, tabulations) avant la parenthèse ouvrante

    Avec sed, j'ai réussi à remplacer le caractère de fin de ligne seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     | sed '{:q;N;s/\n/ /g;t q}'
    Une parenthèse seule:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     | sed '{:q;N;s/{/ /g;t q}'
    Un caractère de fin de ligne suivi de la première lettre de la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     | sed '{:q;N;s/{/\nN /g;t q}'
    Mais pas un caractère de fin de ligne suivi d'un nombre arbitraire d'espaces suivi d'une parenthèse ouvrante...

    Merci pour votre aide !

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Solution avec awk
    http://www.shellunix.com/awk.html
    http://lea-linux.org/cached/index/Dev-awk.html
    http://www.shellunix.com/regexp.html


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    awk '{
    if ($1 ~ /[ \t]*{/) {
    	printf("%s {\n",enregPrecedent)
    	sub(/{/,"",$0)
    	tmpEnr=$0
    	gsub(/[ \t]/,"",tmpEnr)
    	if (length(tmpEnr) != 0) {
    		print $0
    	}
    	enregPrecedent=""
    	next
    } 
    if (enregPrecedent != "") {
    	print enregPrecedent
    }
    enregPrecedent=$0
    }
    END {
    print $0
    } ' liste.txt

    liste.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Mesh =
     {
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
     
    Mesh =
     	{ aa aa
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
     
    Mesh =
     	{ bb bbbbbb
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
    Résultat du traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Mesh = {
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
     
    Mesh = {
             aa aa
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }
     
    Mesh = {
             bb bbbbbb
    Name = "referenced_name";               
    File = "mesh_filename";
    Type = "msh";                            
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Parfait ! Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout de caractéres en fin des lignes d'un fichier texte
    Par loubna04 dans le forum VBScript
    Réponses: 1
    Dernier message: 30/03/2010, 12h03
  2. Réponses: 2
    Dernier message: 17/09/2009, 10h02
  3. Détecter un caractère comme fin de ligne en lisant un fichier
    Par dtwelve dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/07/2009, 17h25
  4. Problème avec le caractère de fin de ligne entre linux et windows
    Par Dosseh dans le forum Programmation et administration système
    Réponses: 3
    Dernier message: 28/07/2009, 14h04
  5. Caractère en fin de ligne avec regsub
    Par sylvain_54 dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 14/08/2008, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo