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 :

Supprimer différents espaces dans ligne précise


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut Supprimer différents espaces dans ligne précise
    Bonjour,

    Supposons que j'ai cette ligne dans un fichier toto : Il fait beau "le ciel bleu".
    Cette ligne est prise comme tel dans sed avec un seul espace séparant les mots :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i.bak 's/^Il fait beau "le ciel est bleu"$/d' "toto"
    Si j'ai des un ou plusieurs espaces dans ma ligne, comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il  fait   beau    "le ciel est      bleu" (avec respectivement : 2, 3 et 4 espaces pour les mots avant les "" et 5 espaces entre  le est et bleu se trouvant entre les "".
    Comment dire pour sed de supprimer cette ligne du fichier toto ou de la remplacer par une autre ligne malgré la présence des différents espaces ?

    Résultat actuel : dès qu'il y a le moindre espace de différence entre la ligne du script et celle du fichioer toto, sed ne fait rien !!

    Merci

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu peux utiliser le répéteur

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/le.*ciel.*bleu//' fichier

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par frp31 Voir le message
    tu peux utiliser le répéteur

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/le.*ciel.*bleu//' fichier
    Attention avec le "répéteur", il signifie tout aussi bien aucune occurrence, une occurrence ou plusieurs occurrences

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' 
    le ciel est bleu
    Il  fait   beau    "le ciel est      bleu"
    bli bli bli
    lecielbleu
     
    $ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' | sed '/le.*ciel.*bleu/d'
    bli bli bli
     
    $ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' | sed '/le.\+ciel.\+bleu/d'
    bli bli bli
    lecielbleu
     
    $

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 54
    Par défaut
    Merci de votre aide !

    Ca marche, et voici mes tests à la fois pour et pour supprimer :

    Fichier titi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Il fait beau "le ciel est bleu"
    Il fait beau "le ciel     est bleu"
    Il fait beau "le ciel estbleu"
    Il fait     beau "le ciel est bleu"
    Ilfait beau "le ciel est bleu
    Commandes sed pour remplacer et pour supprimer (ça remplace et supprime sans exception !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -i.bak -e 's/^Il.*fait.*beau.*"le.*ciel.*est.*bleu.*"$/Il fait beau "le ciel est bleu"/' "titi"
    sed -i.bak -e '/^Il.*fait.*beau.*"le.*ciel.*est.*bleu.*"$/d' "titi"
    Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?

    Merci
    ~

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bras39 Voir le message
    Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?
    Salut

    Puisque les espaces te gênent, retire-les de l'équation...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sed -e "s/ //g" titi |grep -n "Ilfaitbeau\"lecielestbleu\"" | cut -f1 -d: |while read pos
    do
        sed -i.bak -e "${pos}d" titi
        sed -i.bak -e "${pos}s/^.\{1,\}$/Il fait beau \"le ciel est bleu\"/" titi
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Bonjour,
    Citation Envoyé par bras39 Voir le message
    Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?
    A supposer que tu utilises bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ligne='Il fait beau "le ciel est bleu"'
    $ echo 'Il fait beau "le        ciel est          blaeu"'|sed "/^${ligne// / $'\{1,\}'}$/d"
    Il fait beau "le        ciel est          blaeu"
    $ echo 'Il fait beau "le       ciel est          bleu"'|sed "/^${ligne// / $'\{1,\}'}$/d"
    $
    Si ton shell ne permet pas l'utilisation de la syntaxe ${ligne// / $'\{1,\}'} :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ligne='Il fait beau "le ciel est bleu"'
    $ ligne1="$(echo "${ligne}"|sed 's/ / \\{1,\\}/g')"
    $ echo 'Il fait beau "le        ciel est          blaeu"'|sed "/^${ligne1}$/d"
    Il fait beau "le        ciel est          blaeu"
    $ echo 'Il fait beau "le       ciel est          bleu"'|sed "/^${ligne1}$/d"
    $

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/05/2012, 15h52
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. Réponses: 1
    Dernier message: 12/12/2006, 18h31
  4. supprimer les espaces dans une chaîne de caratères.
    Par Empty_body dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2006, 18h43
  5. [String] supprimer un espace dans un String
    Par Zanton dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 15h33

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