Forum Programmation.shell extraction d'un chiffre dans un ligne de donnée (sed?)

Posté par  .
Étiquettes : aucune
0
20
sept.
2012

Bonjour,

j'y connais pas grand chose en ligne de commande unix mais j'ai un besoin ponctuel.
Si je pouvais avoir une piste vers laquelle m'orienter rapidement.

J'ai un texte qui ressemble à ceci:
1519 créer une branche toto 23/03/2012 Branch1.0.X : first checkin

je voudrait extraire le chiffre (1519) en début de ligne avec des outils que j'ai sous la main. J'ai commencé par regarder sed mais la syntaxe est un peu ardue.

Quelqu'un aurait une idée ou une syntaxe sed approchante? Si y'a une explication, c'est encore mieux ;)

Merci beaucoup d'avance

  • # cut

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

    Perso, j'utiliserais cut, sed est un peu overkill juste pour ça. Si ton chiffre est toujours en 1ère position, ça donnerais:
    cut -d " " -f 1

  • # awk !

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

    pour cela le plus simple c'est awk :

    awk '{print $1}' file
    
    
  • # sed

    Posté par  . Évalué à 1.

    sed -e "s/([0-9]{1,4})(.*)/\1/"

    \(^[0-9]\{1,4\}\) = paterne 1 ( 1519 ) 1 à 4 chiffre en début de chaîne
    \(.*) = paterne 2, les autres caractères
    \1 = affiche le paterne 1

    @+

    • [^] # Re: sed

      Posté par  . Évalué à 2.

      paterne : heu, ca exist ca ?

      en anglais : Pattern
      en francais : Motif

      • [^] # Commentaire supprimé

        Posté par  . Évalué à 2.

        Ce commentaire a été supprimé par l’équipe de modération.

        • [^] # Re: sed

          Posté par  . Évalué à 4.

          oui oui ca existe,
          merci,

          mais ca ne veut pas dire "motif" et ce n'est pas une traduction de "Pattern" en anglais

  • # Autre solution

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

    J'utiliserais la solution awk fournie plus haut, mais juste parce que je peux, je poste aussi une version pour grep.

    grep -o "^[0-9]\+"

    • [^] # Re: Autre solution

      Posté par  . Évalué à 2.

      au début, j'avais prévu ça mais le grep que j'ai sous la main ne gère pas l'option -o

  • # SED

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

    Salut, voilà un filtre SED qui reformate tes lignes

    sed -n -e '/créer une branche/s/^\([0-9]*\) créer une branche \([^ ]*\) \([^ ]*\) \([^ ]*\) : \(.*\)/\1|\2|\3|\4|\5/p'
    
    

    Il transforme

    1519 créer une branche toto 23/03/2012 Branch1.0.X : first checkin
    
    

    en

    1519|toto|23/03/2012|Branch1.0.X|first checkin 
    
    

    Ensuite tu peux travailler tes données comme tu veux grâce à AWK (avec l'option -F '|' indiquant que les champs sont séparés par des | )

    Exemple:

    echo '1519 créer une branche toto 23/03/2012 Branch1.0.X : first checkin ' | sed -n -e '/créer une branche/s/^\([0-9]*\) créer une branche \([^ ]*\) \([^ ]*\) \([^ ]*\) : \(.*\)/\1|\2|\3|\4|\5/p' | awk -F '|' '$2 ~ "toto" {print($1,$5)}'
    
    

    Ici l'appel à AWK sélectionne les champs dont l'user est toto, affiche le nombre myst`ere et le message de commit.

    1519 first checkin 
    
    
  • # Merci

    Posté par  . Évalué à 2.

    Merci à tous, j'ai réussi à faire ce que je voulais!

    Enfin, à avancer, car j'ai un autre problème mais c'est une autre histoire ;)

  • # bash

    Posté par  . Évalué à 4.

    $ x="1519 créer une branche toto 23/03/2012 Branch1.0.X : first checkin "
    $ y=${x/ *}
    $ echo $y
    1519
    
    
    • [^] # Re: bash

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

      Si il en a un ça va, si il veut filtrer un fichier de logs, il vaut beaucoup mieux passer par un filtre externe (je prooposais sed) du genre

      loop()
      {
         while read number; do
         …
         done
      }
      
      filter()
      {
        sed …
      }
      
      filter < logfile | loop
      
      

      beacoup plus efficace que si tu remplaces la loop avec une édition des valeurs lues.

Suivre le flux des commentaires

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