Forum Programmation.shell Comment couper des lignes dans un fichier

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

Comment couper des ligne dans un fichier a partir d'un N° de ligne?

Voici mon script:

#!/bin/sh

rep="/log"
fic="trace.log"
NumDebut=`cat -n $rep/$fic | grep "/09/" | head -n1 | awk '{print $1}' `
NumFin=`cat -n $rep/$fic | grep "/09/" | tail -1 | awk '{print $1}'`

sed -e "$NumDebut,$NumFind" > $rep/filtre.txt
exit

C'est la dernière ligne avec sed qui ne marche pas.
Je ne trouve pas comment couper les lignes trouves par NumDebut et NumFin. Pourtant c'est bien cette commande avec sed ? pour couper des lignes dans un fichier ?

Quelqu'un a t'il une solution ?

Merci pour toutes réponses.
  • # sed

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

    Si tu veux les lignes de 5 à 9 de ton fichier, il suffit de faire :

    sed -n 5,9p $rep/$fic
    • [^] # Re: sed

      Posté par  . Évalué à 1.

      Oui mais les couper du fichier sources puis les coller dans un autre fichier ? comment faire ?
      • [^] # Re: sed

        Posté par  . Évalué à 2.

        Tu peux utiliser ed:


        ed $rep/$fic <<EOF
        $NumDebut,$NumFin w $rep/filtre.txt
        $NumDebut,$NumFin d
        w
        q
        EOF
        • [^] # Re: sed

          Posté par  . Évalué à 1.

          Merci beaucoup,

          ça marche.

          Merci aussi a tous pour toutes les réponses.
  • # pb de variable shell

    Posté par  . Évalué à 4.

    « sed -e "$NumDebut,$NumFind" > $rep/filtre.txt »

    Ici, ton shell va faire une substitution de "$NumFind" par rien du tout vu que la variable NumFind n'existe pas. Ce que tu veux, c'est plutôt "${NumDebut},${NumFin}d" : les accolades permettent de bien délimiter ce qui est nom de variable et ce qui ne l'est pas.

    Bon et sinon, je vois pas trop sur quel fichier ton sed est censé travailler. Enfin, là il va bosser sur l'entrée standard, donc faut que tu pipes un truc vers ton script shell. Si c'est pas ça que tu voulais faire, faudrait que tu passes le nom du fichier en argument à sed.
    • [^] # Re: pb de variable shell

      Posté par  . Évalué à 1.

      Merci ça marche.
      J'ai fait cette commande:
      sed -e "${Numdebut},${NumFin}d" $rep/$fic > $rep/filtre.txt
      ça marche, mais y a un os:
      les lignes de mon fichier $fic non pas été coupés.
      En faite cette commande fait la même chose que grep mais un peut plus élaboré parce qu'on lui impose des N° de lignes.
      Ce que je souhaite, c'est qu'il coupe les lignes souhaités et les colles dans un autre fichier.
      Le problème est comment faire ? je ne trouve pas!
      j'ai pensé a sed mais ?...
      • [^] # Re: pb de variable shell

        Posté par  . Évalué à 2.

        Ah... ok, donc tu veux à la fois les virer de l'un et les ajouter dans l'autre. Si c'est bien ça, et bah j'avais pas capté.

        En sed, ça pourrait se faire avec d'une part l'option '-i', qui permet de modifier un fichier sur place (ici, on va lui faire des 'd' pour effacer les lignes à couper), et d'autre part avec la commande 'w' qui permet d'écrire dans un fichier. Ça donnerait ça (oui oui, sur 2 lignes, pour séparer les 2 commandes entre accolades) :

        sed -i -e "${Numdebut},${NumFin}{w$rep/filtre.txt
        d}" $rep/$fic
  • # awk : tout d'un coup

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


    awk "NR==$NumDebut,NR==$NumFin{print>\"fichier_colle\"}NR<$NumDebut||NR>$NumFin{print}' fichier_entree > fichier_coupe


    Et voilou. Les lignes coupées sont dans fichier_colle. Le fichier fichier_coupe ne contient plus les lignes coupées.

Suivre le flux des commentaires

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