Sed recalcitrant

Résolu
Bonjour,

Je voudrais dans un fichier test.txt ,
1 . faire une recherche de motif sur plusieurs lignes
2 . à la suite de ce motif ajouter 3 lignes
3 . faire cet ajout pour toutes les occurences du motif en question

j'ai essayé ça :

sed -n '/vip/d;/^debut_motif/,/fin_motif$/p' test.txt | sed -f prog.sed > sortie.txt

le prog.sed contient ça :
a\
ligne1\
ligne2\
ligne3

Donc ça ne fonctionne pas du tout : le script colle le texte partout !!

je pense qu'il faudrait arriver à chainer les commandes du type :

sed '/motif/; ajout du texte' test.txt > sortie.txt

quelqu'un peut me donner un coup de main ?

merci d'avance,
Configuration: Windows XP
Firefox 3.0.10

9 réponses

  1. ok, merci Jipicy

    ça fonctionne , ouf !!

    j'ai recréé mon script et c'est ok ; je pense qu'il y avait des caractères invisibles
    qui mettait la grouille.

    merci de ton aide et bonnes vacances !
    1. Modérateur
       ssh$ cat eric.ksh
      #! /bin/ksh
      
      sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
      <Attribute>
      }
      ' toto
      
       ssh$ ./eric.ksh
      <Service>
      <Name>PROD_ORA8</Name>
      <Label>Oracle 8</Label>
      <Icon>logo_oracle.png</Icon>
      <CalcRuleRef>Most critical</CalcRuleRef>
      <MsgPropRuleRef>Unchanged</MsgPropRuleRef>
      </Service>
      <Association>
      <Dependency/>
      <SourceRef>XGDGF</SourceRef>
      <TargetRef>PROD_ORA8</TargetRef>
      <PropRuleRef>Unchanged</PropRuleRef>
      </Association>
      <Service>
      <Name>XFDGF</Name>
      <Label>XFDGF</Label>
      <Icon>logo_oracle.png</Icon>
      <Attribute>
      <Depth>2</Depth>
      <CalcRuleRef>Most critical</CalcRuleRef>
      <MsgPropRuleRef>Unchanged</MsgPropRuleRef>
      </Service>
      <Association>
      <Dependency/>
      <SourceRef>xtruc.fr</SourceRef>
      <TargetRef>XBIDXX</TargetRef>
      <PropRuleRef>Unchanged</PropRuleRef>
      </Association>
      <Association>
      <Dependency/>
      <SourceRef>XDFEYY</SourceRef>
      <TargetRef>PROD_ORA8</TargetRef>
      <PropRuleRef>Unchanged</PropRuleRef>
      </Association>
      <Service>
      <Name>XXTTYU</Name>
      <Icon>logo_oracle.png</Icon>
      <Attribute>
      <Depth>2</Depth>
      <CalcRuleRef>Most critical</CalcRuleRef>
      
      
      1. ok, voilà le script (sans fonction ^^) :

        #!/usr/bin/ksh

        sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
        <Attribute>
        }
        ' test.txt > sortie.txt

        et voilà un extrait du fichier à modifier :

        <Service>
        <Name>PROD_ORA8</Name>
        <Label>Oracle 8</Label>
        <Icon>logo_oracle.png</Icon>
        <CalcRuleRef>Most critical</CalcRuleRef>
        <MsgPropRuleRef>Unchanged</MsgPropRuleRef>
        </Service>
        <Association>
        <Dependency/>
        <SourceRef>XGDGF</SourceRef>
        <TargetRef>PROD_ORA8</TargetRef>
        <PropRuleRef>Unchanged</PropRuleRef>
        </Association>
        <Service>
        <Name>XFDGF</Name>
        <Label>XFDGF</Label>
        <Icon>logo_oracle.png</Icon>
        <Depth>2</Depth>
        <CalcRuleRef>Most critical</CalcRuleRef>
        <MsgPropRuleRef>Unchanged</MsgPropRuleRef>
        </Service>
        <Association>
        <Dependency/>
        <SourceRef>xtruc.fr</SourceRef>
        <TargetRef>XBIDXX</TargetRef>
        <PropRuleRef>Unchanged</PropRuleRef>
        </Association>
        <Association>
        <Dependency/>
        <SourceRef>XDFEYY</SourceRef>
        <TargetRef>PROD_ORA8</TargetRef>
        <PropRuleRef>Unchanged</PropRuleRef>
        </Association>
        <Service>
        <Name>XXTTYU</Name>
        <Icon>logo_oracle.png</Icon>
        <Depth>2</Depth>
        <CalcRuleRef>Most critical</CalcRuleRef>

        chez moi ça ne passe pas !!
        1. j'ai compris l'erreur jipicy :

          j'insère des lignes comme celles là :

          <Attribute>\
          <Name>ov_label1</Name>\
          <Value>ORACLE</Value>\
          <ActionRef>ora_consigne-1<\/ActionRef>\
          <ActionRef>ora_consigne-2<\/ActionRef>\
          <ActionRef>ora_consigne-3<\/ActionRef>

          et ça fait l'erreur en question (si je met ligne1, ligne2 etc... pas de pb)

          j'ai essayé d'echapper les / avec des \ mais ce n'est pas bon....et meme avec la première ligne
          ça fait l'erreur aussi !!
          1. Modérateur
            Y'a pas de raisons que ça ne marche pas :-\
             ssh$ sed '/motif Début/,/motif Fin/{/motif Fin/a\
            <lalala>xxx</lalala>\
            <lololo>yyy</lololo>\
            <lululu>zzz</lululu>
            }
            ' plop
            blablabla
            blablablablablabla
            motif Début
            blablabla
            blablabla
            blablabla
            motif Fin
            <lalala>xxx</lalala>
            <lololo>yyy</lololo>
            <lululu>zzz</lululu>
            blablablablablabla
            blablabla
            motif Début
            blablablablablabla
            motif Fin
            <lalala>xxx</lalala>
            <lololo>yyy</lololo>
            <lululu>zzz</lululu>
            blablabla
            blablablablablabla
            blablabla
            blablabla
            motif Début
            blablabla
            motif Fin
            <lalala>xxx</lalala>
            <lololo>yyy</lololo>
            <lululu>zzz</lululu>
            blablabla
            blablabla
            Colle-nous un bout de ton fichier et ta syntaxe "sed" s'il te plaît...
        2. non, c'est du ksh

          !!
          1. Modérateur
            Et pour la fonction ?

            C'est possible d'avoir le fichier d'entrée et le script en entier ?
        3. voilà mon script :

          sed '/vip/d;/^<Name>X/,/Icon>$/{/Icon>$/a\
          ligne1\
          ligne2\
          ligne3
          }
          ' test.txt > sortie.txt

          je ne comprends pas
          1. Modérateur
            Pourquoi le message d'erreur plus haut fait état d'une fonction ?

            C'est du bash ton script ?
        4. Encore un petit soucis :
          la commande fonctionne quand je colle dans un terminal, par contre en script ça ne passe pas...
          le shell me repond :

          fonction '/motif_a_eviter/d;/debut_motif/,/fin_motif/{/fin_motif/a\ cannot be parsed

          ??

          dans un script il faut peut etre mettre sur une seule ligne ?
          1. Modérateur
            Elle ressemble à quoi ta syntaxe dans le script ?

            La même syntaxe que plus haut dans un script passe bien chez moi ;-\
        5. Ok, ça marche !
          J'avais essayé ça mais je n'avais pas remis le motif de fin.

          Bravo, tu es vraiment le gourou du sed.
          Je vais m'y mettre sérieusement...

          et merci beaucoup

          eric
          1. Modérateur
            L'ajout et l'insertion n'acceptent qu'une seul adresse (et non pas une plage), donc il faut d'abord cibler une plage d'adresses et au sein de cette plage, cibler l'adresse qui va bien...

            ;-))
        6. Modérateur
          Salut,
          [tmpfs]$ cat plop
          blablabla
          blablablablablabla
          motif Début
          blablabla
          blablabla
          blablabla
          motif Fin
          blablablablablabla
          blablabla
          motif Début
          blablablablablabla
          motif Fin
          blablabla
          blablablablablabla
          blablabla
          blablabla
          motif Début
          blablabla
          motif Fin
          blablabla
          blablabla
          
          [tmpfs]$ sed '/motif Début/,/motif Fin/{/motif Fin/a\
          ligne1\
          ligne2\
          ligne3
          }
          ' plop
          blablabla
          blablablablablabla
          motif Début
          blablabla
          blablabla
          blablabla
          motif Fin
          ligne1
          ligne2
          ligne3
          blablablablablabla
          blablabla
          motif Début
          blablablablablabla
          motif Fin
          ligne1
          ligne2
          ligne3
          blablabla
          blablablablablabla
          blablabla
          blablabla
          motif Début
          blablabla
          motif Fin
          ligne1
          ligne2
          ligne3
          blablabla
          blablabla
          
          [tmpfs]$
          ;-))