Forum Programmation.shell Modifier une seul ligne d'un tableau...

Posté par  .
Étiquettes : aucune
0
4
oct.
2005
Bonjour à tous


J'ai un tableau de type:



info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4
info1 info2 info3 info4

Les infos sont separées par des tabulations.

comment faire si je ne veut modifier que la troisieme ligne par exemple...?

En bash, awk ou sed bien sur...!!

J'ai bien trouvé des solution "bencale" avec head ou autre...
Mais c'est un peu le bordel...
  • # avec sed

    Posté par  (site web personnel) . Évalué à 7.

    Pour changer "info2" en "plop" dans la 3e ligne :

    sed "3s/info2/plop/" tableau > nouveau_tableau
    • [^] # Re: avec sed

      Posté par  . Évalué à 3.

      Donc comme mon souci c'est que je ne connais
      pas forcement l'information, je dois savoir ce qu'il y a 'emplacement du tableau...

      si je fais:

      var=$(sed -n `echo $ligne`,`echo $ligne`p /etc/hosts | awk '{print $2}');
      sed "`echo $ligne`s/$var/plop/" /etc/hosts > new_fichiers

      ça marche..!!

      Bon mon probleme, c'est que certaine des mes variable contiendrons
      des slashs et des espaces...

      Va falloir que j'echappe tout ça...
      • [^] # Re: avec sed

        Posté par  . Évalué à 6.

        C'est probablement plus simple tout en awk, genre :
        awk "NR == ${ligne} { \$2 = plop } ; { print \$0 }" ancien_fichier > nouveau_fichier

        ls « NR == ${ligne} { \$2 = plop } » va modifier le 2ème champs de la ligne n°$ligne, et le « print \$0 » va afficher les lignes quelles qu'elles soient, modifiées ou non.
        • [^] # Re: avec sed

          Posté par  . Évalué à 4.

          errr... s/ls/Le/
      • [^] # Re: avec sed

        Posté par  (site web personnel) . Évalué à 3.

        Bon mon probleme, c'est que certaine des mes variable contiendrons
        des slashs et des espaces...

        Va falloir que j'echappe tout ça...


        Absolument pas. Le premier caractère suivant la commande 's' indique le caractere de séparation des arguments de la dite commande.

        Ainsi, on pouvoit aussi ecrire :
        sed '3s;info2;plop;'

        Il faut donc trouver un caractère qui n'apparaitra jamais. Pour cela, le ';' est pas mal car on l'utilise quasiment jamais dans une valeur manipulée par shell du fait de sa nature de séparation.


        Par contre, ton code est bien compliqué.
        Si je résume, tu veux remplacer la second champ de la nieme ligne ?
        Auquel cas il vaut mieux tout faire avec awk :
        awk "NR==$ligne"'{$2=plop}' /etc/hosts
        Attention, noter le jeux entre double quote et simple quote ainsi que l'absence de blancs entre les deux chaines. Plus classiquement, en échappant cela done :
        awk "NR==$ligne"{\$2=$nouvelle}" /etc/hosts
  • # encore une autre solution

    Posté par  . Évalué à 3.

    changer la n iem ligne
    {
    head -$(( $n - 1 )) fich
    echo "la nouvelle ligne"
    tail -$(( $(wc -l fich) - $n )) fich
    } > fich2
    mv fich2 fich

    ps : ne pas oublier qu il y a une difference entre $( et $(( $( fait comme les ` mais c'est beaucoup plus facile a imbriquer, l' autre $(( sert a faire des calculs comme avec la commande expr ^^

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.