Forum Programmation.shell sed et écriture dans un fichier

Posté par  .
Étiquettes : aucune
0
24
nov.
2005
Bonjour ,

j'ai un (encore ^^) ptit problème avec la commande sed

j'ai besoin de sélectionner certaines lignes d'un fichier texte.
Ces lignes sont délimitées par des balises (similaires à des balise HTML).

en gros un truc du genre :
AA
BB
CC
DD
EE
`Directory`
FF
GG
HH
`/Directory`

Et je voulais supprimer les lignes qui apparaissent entre les balises "Directory" , pour cela , j'ai utilisé la commande Sed suivante :

* sed -e "/`Directory`/,/`\/Directory`/d" test.txt

ce cas "simple" fonctionne (enfin simple... j'ai quand même bien galéré , mais passons ^^)

Petit problème : la première balise contient une variable qui permet de définir dans le code quel 'repertoire' utiliser.
elle ressemble donc plutot à ça :

`Directory "/home/nomUser/TrucsBidules"' `

et c'est la que viens tous le problème , dans le nom de repertoire y'a des '/' (caractère que sed semble avoir du mal à gérer)....
Je dois placer l'adresse dans une variable , donc au final la commande sed ressemble à ça :

sed -e '/`Directory \"$value\"`/,/`\/Directory`/d' monfichier


$variable=/home/nomUser/Trucsmachin

Et bien entendu ça ne fonctionne pas ...

Kelk'un aurait une idée sur la démarche à suivre pour régler le problème ?
  • # sed

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

    deja pour commencer remplace tes / par des +, par exemple, ce qui donne

    sed -e 's/+a+b+/'

    pour remplacer a par b
    • [^] # Re: sed

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

      Faut que j'arrete d'ecrire des conneries moi...

      sed -e 's+a+b+'
  • # backslash slash

    Posté par  . Évalué à 1.

    Ben il faut que tu backslashes les slashes dans ta variable. Il faut aussi backslasher tes backquotes (désolé pour le franglais à deux balles)
    Ex:

    bruno@silver:/tmp$ cat test.txt
    AA
    BB
    CC
    DD
    EE
    `Directory /home/nomUser/TrucsBidules`
    FF
    GG
    HH
    `/Directory`
    bruno@silver:/tmp$ cat test.sh
    value=/home/nomUser/TrucsBidules
    value2=`echo $value | sed -e "s#/#\\\\\/#g"`
    echo value2=$value2
    sed -e "/\`Directory $value2\`/,/\`\/Directory\`/d" test.txt
    bruno@silver:/tmp$ ./test.sh
    value2=\/home\/nomUser\/TrucsBidules
    AA
    BB
    CC
    DD
    EE
    bruno@silver:/tmp$
    • [^] # Re: backslash slash

      Posté par  . Évalué à 1.

      O_o ....
      C'est marrant comme les solutions sembles "preske" trivial lorsqu'elle sont proposé par les autres ;-)

      Merci beaucoup , c'est exactement ce que je voulais faire.

      Une dernière question néanmoins , à koi sert cette ligne :
      echo value2=$value2

      ???

      (j'ai preske honte de poser la question , mais je vois vraiment pas ce que fait cette ligne ^^)

      Merci encore .
      Dart
      • [^] # Re: backslash slash

        Posté par  . Évalué à 1.

        Une dernière question néanmoins , à koi sert cette ligne :
        echo value2=$value2

        A rien, c'était à but didactique. Tu peux la supprimer sans problème.
      • [^] # Re: backslash slash

        Posté par  . Évalué à 2.

        la premiere solution proposée est tout de meme plus elegante qu'un traitement suplementaire pour preparer la variable, a condition de ne pas se planter dans la syntaxe, celle exposée n'etant non seulement valable que pour la commande de substitution mais en plus fausse :-)

        pour remplacer les slash utilisés pour englober les regexp d'adresses par un autre caractere cela fonctionne comme pour les substitution mais en prefixant le premier par un backslah, dans ton cas une syntaxe de la forme:

        \XregexpX,\YregexpYcommande

        exemple en utilisant le # comme separateur:

        $ cat file
        AA
        BB
        `Directory "./A/B/C/D"`
        CC
        DD
        `/Directory`
        EE
        FF
        $ value='"./A/B/C/D"'
        $ sed "\#\`Directory $value\`#,\#\`/Directory\`#d" < file
        AA
        BB
        EE
        FF
        • [^] # Re: backslash slash

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

          C'est bizarre, j'etais pourtant pas (encore) bourré quand j'ai posté ôO
          • [^] # Re: backslash slash

            Posté par  . Évalué à 1.

            O_o
            Alors la chapeau....

            j'avais effectivement la première solution proposé sans succés (et moi non plus j'était pas bourré ^^)

            Bref , bref , merci beaucoup pour ces interventions ...
            Le problème du sed est réglé.... en tout cas pour l'instant.

            Au final je crois que j'ai pigé la syntaxe de base , mais dès qu'il s'agit de faire des trucs un peu compliqué j'ai tendance à être complètement perdu.
            Je comprends mal pourkoi le fait de mettre un # comme séparateur régle le problème 'comme par magie' (enfin j'imagine que c'est pour que le shell ne considère pas les '/' de la variable comme des séparateurs du sed ....).

            Et surtout , je pige pas pourkoi dans la solution proposé par BigBen99 , l'inversion de la commande (utilisation de '!d' plutot que de 'd' pour n'afficher que ce qui est dans les balises) est impossible....

            Enfin, j'crois que j'suis pas trop doué avec cette commande ;-)

            Merci encore.

Suivre le flux des commentaires

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