Forum Programmation.shell document recapilutatif SED

Posté par  .
Étiquettes : aucune
0
21
sept.
2007
bonjour,

connaissez vous un site internet ou une doc à télécharger récapitulant une somme d'exemple pour toutes les fonctions de sed (ou la plus grande partie ).
ça meviterai de perdre beaucoup de temp , le man ne donne pas d'exemple et info sed n'en donne que peut, pour trouver une info précise sur le net faut toujours chercher longtemps

par exemple au passage , comment inserer une ligne dans un fichier juste avant la première occurence d'un mot ?
le faire à chaque occurence est simple :

sed '/\<motif\>/i \chaine_à_inserer' fichier_à_traiter


mais comment le limiter à uniquement la premiere occurence du texte???

merci de vos réponse
  • # rechercher/remplacer

    Posté par  . Évalué à 2.

    avec $chaine=XXX et $motif=toto (par exemple)
    cela devrait changer le texte toto en XXXtoto
    sed -e 's/$motif/$chaine$motif/' fichier

    et si tu veux le faire pour toute les occurences
    sed -e 's/$motif/$chaine$motif/g' fichier

    enfin chez moi c'est comme ca que ca marche.

    je penses que le MAN te donne toute les infos, apres il faut trouver comment combiner les options et les regexp

    et surtout se SIMPLIFIER la vie
    ton probleme : inserer un chaine avant un motif
    la solution : rechercher le motif, le remplacer par chaine+motif
    • [^] # Re: rechercher/remplacer

      Posté par  . Évalué à 2.

      c'est pas exactement ce que je recherche
      mon script me declare automatiquement des variables du genre :
      entete
      temp r4
      temp b3
      temp r8
      temp v2
      const c0
      const c1
      const c2
      int i1
      int i2...

      et je voudrait inserer une ligne vide entre chaque type de declaration afin d'avoir ça
      entete

      temp r4
      temp b3
      temp r8
      temp v2

      const c0
      const c1
      const c2

      int i1
      int i2...

      donc si je fais sed -e 's/$motif/$chaine$motif/' fichier avec motif='temp' et chaine='\n' j'aurais un retour chariot entre chaque temp et avec sed -e 's/$motif/$chaine$motif/g' fichier egualement
      • [^] # Re: rechercher/remplacer

        Posté par  . Évalué à 2.

        autant pour moi, il me semblait que l'absence du g à la fin de la syntaxe suffisait à lui dire de ne le faire qu'à la premiere occurence (mais je dois confondre avec un autre outil)
        • [^] # Re: rechercher/remplacer

          Posté par  . Évalué à 4.

          oui, il y a bien une histoire d'occurence. Quand g n'est pas là, sed ne traite que la première occurence ... de chaque ligne !
  • # fais bosser ton imagination

    Posté par  . Évalué à 2.

    y a tellement de façon d'approcher le problème. Au choix :
    - avec awk (pas trop compliqué, mais moyen performant),
    - en utilisant l'option -c de grep et une habile combinaison de head et de tail dans tous les sens (p-e pas super efficace, mais ça doit être rigolo à écrire =)
    - en encapsulant tes regex dans un langage de script de plus haut nieveau (python, perl, ruby, ...)

    bref, innove ! :-)
    • [^] # Re: fais bosser ton imagination

      Posté par  . Évalué à 1.

      je suis un newbie et je galère déjà pas mal , de là à innover j'ai de la marge , j'essaye déjà d'apprendre les trucs communs...
      • [^] # Re: fais bosser ton imagination

        Posté par  . Évalué à 2.

        pas si mal que ça. Au vu des messages que tu as posté ces derniers temps, y a une nette progression déjà :)

        Le problème fondamental, c'est que sed travaille ligne par ligne, et là, tu veux faire quelquechose pour lequel il faut travailler sur plusieurs lignes. Forcément, ça va être compliqué ...

        en repartant de ton exemple dans un commentaire ci dessus, une proposition en awk :
        awk 'BEGIN{prev="unset"} /^const\>|^int\>|^temp\>/ {if (prev != $1) print ""; print $0; next} {print}'

        attention, cette version ne fonctionne que si tes identifiants (int, const ou autre) sont en début de ligne puisque $1 représente le premier élément de la ligne.

        C'est pas le hello world du awk, donc l'opportunité d'apprendre quelques trucs de plus ;)
        man awk pour plus de détails, et pose d'autres questions si tu t'en sors pas !
        • [^] # Re: fais bosser ton imagination

          Posté par  . Évalué à 2.

          youps, désolé, j'ai pas recopié toute la ligne :
          awk 'BEGIN{prev="unset"} /^const\>|^int\>|^temp\>/ {if (prev != $1) print ""; print $0; prev = $1; next} {print}'
  • # Suffit de demander...

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

    • [^] # Re: Suffit de demander...

      Posté par  . Évalué à 1.

      cool, dommage que ce soit pas en français (...j'en demande de trop peut etre.... :) )

Suivre le flux des commentaires

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