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 un mot dans une ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut remplacer un mot dans une ligne
    Bonsoir,

    J'aimerais stocker des infos dans un fichier, sur chaque ligne les infos sont écrites dans un "meme format", par ex :

    info11|||info21|||info31
    info12|||info22|||info32
    etc

    et savoir si c'est possible de changer qu'une seule info sur une ligne, par exemple que info31 et non remettre toute la ligne

    Merci
    ++

  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
    En shell bash, la seule façon simple qui y ressemble est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed -i 's/info31/Nouvinfo/' NomDeFichier
    Petite question : tu utilises comme délimiteurs de champs "|||" ?
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Euh ben justement je me demande quels limititeurs utilisés, les ||| c'est pas recommandé ?

    sed ne peut etre utilisé avec une variable au lieu d'un fichier ?
    par exemple quand je remplace NomDeFichier par une variable qui contient une certaine ligne du fichier, ca ne fonctionne pas...

    Et c'est possible de mettre dans des variables différentes, par ex var1, var2, var3 les infos d'une ligne ?
    Il faut utiliser les expressions régulières ?
    En php, je sais qu'on aurait pu faire un "explode" pour mettre dans un tableau mais la je pense pas que c'est possible..

    merci
    ++

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 25
    Points
    25
    Par défaut
    un truc dans ce genre la devrait marcher je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $TaVariable | sed 's/info31/Nouvinfo/' > YourFile
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaVariable="info11|||info21|||info31"; VariableReceptrice=`echo $TaVariable | sed 's/info31/Nouvinfo/'`; echo $VariableReceptrice
    Le reste j'ai pas tout compris, mais a mon avis... tu veux utiliser awk

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Et bien en fait, pour réexpliquer ce que j'essaie de faire :

    -Stocker des informations dans un fichier
    -Chaque ligne contient les memes genres d'information (délimité par des caracteres : ||| ou autre...) , ex :
    info1|||info2|||info3|||info4
    bla1|||bla2|||bla3|||bla4
    etc...

    et ensuite manipuler ce fichier de données, pour insérer une ligne c'est pas bien compliqué mais ca se complique pour récupérer les infos d'une ligne, par exemple, récuperer dans des varirables les infos d'une meme ligne comme ca :
    $var1 contiendra info1
    $var2 contiendra info2
    $var3 contiendra info3
    $var4 contiendra info4
    si je veux la 1ere ligne.

    Et l'autre problème, c'est pour modifier l'info d'une ligne sans forcément réécrire la ligne entiere, par exemple a la place de info3 de la premiere ligne, mettre "coucou"

    Vous voyez ce que je veux dire ?

    Pouvez-vous m'expliquer rapidement awk ?
    Il me semble que ce serait intéressant de l'utiliser en effet.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    en générale 1 seul caractère de délimitation doit suffire, les "outils" unix te permettront de manipuler correctement tes "champs" dans une ligne de cette façon.
    ensuite extraitre les variables d'une ligne ne te poserons pas de probleme exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bash-3.1$ cat toto.txt
    velo,ballon,maison
    test,aaaa,zzzz,zoo
    bash-3.1$
    bash-3.1$ ./tt
    velo
    ballon
    maison
     
    test
    aaaa
    zzzz
    zoo
    et voici le script pour ce resultat :
    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
     
    #!/bin/sh
    while read ligne
    do
    # le "tr" est la pour changer le caractere separateur en separateur standard unix (le blanc)
     ligne="$(echo "$ligne" | tr -s ',' ' ')"
    # typeset -a  "explose " en tableau la ligne (tableau var)
     typeset -a var=($ligne)
    pour la liste de tout les membres du tableau
       for i in $(seq 0 $(echo ${#var[*]}))
       do
      # affiche l'ement i du tableau
         echo ${var[$i]}
       done
    done < toto.txt
    pour changer 1 variable dans une ligne .. sed est parfait.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 24
    Points : 25
    Points
    25
    Par défaut
    2 exemple d'utilisation d'awk qui pourraient t'aider si tu veux, c'est un truc qui permet de faire vachement de choses sans trop de difficultés... si on connait un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "toto,tata,titi" | awk -F "," '{print $1 " " $2 " " $3}'
    toto tata titi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "toto#tata#titi" | awk -F "#" '{print $1 " blabla " $3}'
    toto blabla titi

  8. #8
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Ok merci je vais me débrouiller avec tout ca maintenant alr

    ++

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Si tu veux vraiment imiter la fonction explode() de PHP il faut que les champs vides soient assignés comme null dans l'élément du tableau.
    un:deux::quatre explosé sur : doit retourner
    a[0] => un
    a[1] => deux
    a[2] =>
    a[3] => quatre


    Le remplacement des : par des espaces va masquer les champs vides:
    un:deux::quatre devient un deux quatre (avec deux espaces entre 2 et 4). Du coup, l'assignation bash a=(un deux quatre) va retourner:
    a[0] => un
    a[1] => deux
    a[2] => quatre


    De plus, les champs contenant un espace seront explosés. Comme dans par exemple:
    un:deux::quatre:et la fin

    Solution en bash (assez tirée par les cheveux je l'avoue)
    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
    #! /bin/bash
    string='un:deux::quatre:et la fin'
     
    until [ "$tolken" =  "$string" ]
    do
            tolken=${string%%:*}    # prend le premier token
            a[$i]=$tolken           # l'affecte à l'élément du tableau
            string=${string#*:}     # supprime ce token de la chaine
            ((i++))
    done
     
    # affichage du tableau
    for index in ${!a[@]}
    do
            echo  a[$index] '=>' ${a[$index]}
    done
    Beaucoup plus facile en ksh:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/ksh
    string='un:deux::quatre:et la fin'
    IFS=:
    set -A a $string
     
    # affichage du tableau
    for index in ${!a[@]}
    do
            echo  a[$index] '=>' ${a[$index]}
    done
    Edit: En bash, il y a plus simple que mon truc plus haut. Tout simplement en utilisant une affectation de tableau classique. Mais attention, il faut utiliser une substitution de variable car, assez bizarrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # espace comme séparateur (marche correctement)
    a=(un deux trois) 
     
    # autre séparateur (ne marche pas)
    IFS=:
    a=(un:deux:trois)
     
    # autre séparateur avec substitution (bonne méthode)
    string='un:deux:trois'
    IFS=:
    a=($string)
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  10. #10
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    Re

    J'ai un petit probleme en fait encore..

    Je sais qu'avec sed je peux changer quelque chose dans un fichier, mais le probleme c'est que j'aimerais changer cette occurence que sur une ligne, et donc si je fais un sed sur tout le fichier, il changera partout ce que je veux changer... alors que je veux pas changer dans tout le fichier...

    vous voyez ce que je veux dire ?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Tu peux filtrer la substitution de sed avec un masque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # sed '/masque/ s/a remplacer/par ceci/g'
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  12. #12
    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
    Citation Envoyé par ripat
    Tu peux filtrer la substitution de sed avec un masque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # sed '/masque/ s/a remplacer/par ceci/g'

    Fichier de données tst.txt :

    info1;info2;TEXT3;info4
    bla1;bla2;TEXT3;bla4

    Sélection sur le n° de la ligne ou sur un "motif" :

    $ sed "2s/TEXT3/AUTRE/" tst.txt
    info1;info2;TEXT3;info4
    bla1;bla2;AUTRE;bla4

    $ sed "/bla1/s/TEXT3/AUTRE/" tst.txt
    info1;info2;TEXT3;info4
    bla1;bla2;AUTRE;bla4

    http://pwet.fr/man/linux/commandes/sed
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  13. #13
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 501
    Points : 144
    Points
    144
    Par défaut
    ok merci

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. récuperer un mot dans une ligne sous C#
    Par ouadie99 dans le forum C#
    Réponses: 2
    Dernier message: 07/01/2008, 17h25
  3. Remplacement de caracteres dans une ligne
    Par tibyann dans le forum Linux
    Réponses: 10
    Dernier message: 14/02/2006, 12h12
  4. Chercher des mots dans une ligne
    Par chemouz dans le forum C++
    Réponses: 1
    Dernier message: 17/12/2005, 12h42

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