Forum Programmation.shell Enlever un saut de page sur deux.

Posté par  .
Étiquettes : aucune
0
11
avr.
2008
Hello !
Voilà, je suis confronté au problème suivant :
j'ai un fichier texte contenant le caractère spécial de contrôle réalisant un saut de page, le fameux ^L.
Je voudrai écrire une commande sed (ou autre, peu importe) qui me supprime un saut de page sur deux rencontrés dans ce fichier.
Je sais bien qu'un sed -i s/^L// fichier va me les supprimer, mais comment faire pour n'en supprimer qu'un sur deux ?
Je ne vois pas du tout du tout comment procéder, et ce n'est pas faute d'avoir lu et relu les pages d'infos de la commande sed.
Merci pour toute aide que vous pourrez me donner sur le sujet.
  • # Petit complément d'informations.

    Posté par  . Évalué à 2.

    Bon, je me suis fait avoir par le programme qui génère les fichiers sur lesquels je veux travailler, et son interface de visulalisation.
    Le problème est ailleurs, malheureusement, et du coup, je reformule ma question.
    Pour expliquer mon problème voici quelques explications. Il s'agit d'un programme qui me génère des fichiers textes en vue d'imprimer des étiquettes. Pour ce faire j'ai un paramètre qui me permet de préciser si je vais imprimer des étiquettes en continu, sur du papier listing, ou sur des feuilles A4.
    Les étiquettes sont de toutes façons au format A5 paysage.
    Si j'indique au programme que je veux des étiquettes en continu, en fait, j'ai un saut de page juste après le cadre de l'étiquette, ce qui fait que j'ai toujours mes 36 lignes de remplies.
    Par contre, si j'indique que je veux imprimer mes étiquettes sur du format A4, le programme remplit la suite de la première étiquette de la page avec des lignes vides pour que la seconde débute au bon endroit (théoriquement). Et c'est là que le bat blesse, car au lieu que la seconde étiquette de la page débute ligne 37, elle débute ligne 34.
    Du coup, à l'édition rien ne va plus.
    C'est donc sur ce second problème qu'il faut que je me penche, mais je ne vois pas trop comment faire pour ajouter 4 lignes dans un fichier dont le contenu est très variable d'une page à l'autre.
    Je n'ai pas de points d'ancrage pour placer un sed (ou autre) correct, il va donc falloir que je trouve une autre solution, qui risque d'être une modification manuelle des fichiers générés par cette application.
    Pardon pour le dérangement, finalement, je me suis emporté sur ce coup là...
    • [^] # Re: Petit complément d'informations.

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

      C'est l'utilisation typique d'un petit script perl ton truc.

      Il faut juste rajouter un etat qui compte les ligne et faire en fonction.

      while(<>){
      $cpt++;
      if($cpt==37) {&cpct=0; print "\n"}
      }

      enfin, bref, ce genre de structure de script.

      "La première sécurité est la liberté"

    • [^] # Re: Petit complément d'informations.

      Posté par  . Évalué à 2.

      une piste à creuser avec awk, en jouant sur le record separator.
      En reprenant le même fichier toto qu'abofrp31 :


      awk 'BEGIN {RS="^L"}{print NF}' toto
      6
      4
      3
      3
      3


      yapuka (c) travailler sur le traitement que doit faire awk. peut-être pour avoir des sauts de lignes toutes les 10 lignes, quelque chose comme ça :
      nb_lignes=10
      awk 'BEGIN {RS="^L"; ORS=""}{print $0; for(i=NF; i <= '$nb_lignes'; i = i+1) print "\n"; print "^L"}' toto


      il reste un ^L en toute fin de fichier.
      Si ça ne te convient pas, il suffit dans un premier temps d'appliquer ce script awk sans le print "^L", et dans un deuxième temps d'ajouter les "^L" en question toutes les nb_lignes
  • # il faut jouer

    Posté par  . Évalué à 2.

    il faut jouer par exemple la commande interne sed suivante : n;N;s/pattern/rien/


    IUI2:root # cat toto
    ezrze
    rzeerz
    rzerzer
    zrerze
    zrezre
    zezer
    ^L
    ezrzrerez
    rzerzezre
    zrezrezre
    zerzzrer
    ^L
    rzerzezreze
    zrrzezrezer
    zerrzeezr
    ^L
    rzrzezre
    zrzrerze
    zzerzre
    ^L
    rzerzrze
    zrezrzer
    zerzerze
    IUI2:root #
    IUI2:root # sed 'n;N;s/\^L/ /' toto
    ezrze
    rzeerz
    rzerzer
    zrerze
    zrezre
    zezer
    ^L
    ezrzrerez
    rzerzezre
    zrezrezre
    zerzzrer

    rzerzezreze
    zrrzezrezer
    zerrzeezr
    ^L
    rzrzezre
    zrzrerze
    zzerzre

    rzerzrze
    zrezrzer
    • [^] # Re: il faut jouer

      Posté par  . Évalué à 3.

      a tester aussi selon le sed utilisé

      sed '/^L/1~2d' toto

Suivre le flux des commentaires

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