Sed et expression réguliere encore

Bonjour,

en ces temps sombres, je reviens vers vous...
j'ai de nouveau un soucis d'expression régulière. J'étais "mauvais"... maintenant je ne suis "pas bon" :)

J'ai des fichiers commençant soit par :
#
  blabla (bla). -  blablabla. blabla-blabla.
blablablabalbalbalba
blablablablablabal

soit par :
#

  blabla (bla). -  blablabla. blabla-blabla.
blablablabalbalbalba
blablablablablabal


Il se peut qu'il n'y ait qu'une seule ligne de texte (apres le # et éventuellement la ligne vide) dans un fichier.

Objectif :
-supprimer la première ligne avec le # et supprimer la seconde ligne si elle est vide
-récupérer le texte de la seconde ligne de la forme "blabla blablab bkla (bla)" pour renommer le fichier par ce texte
- et du coup enlever le ". - " qui reste avant le début du texte

j'ai essayé des trucs dans le genre de :
tail -n +2 $file | sed '/^$/d' |sed '1{h;d; s/.*-\(.*\)/\1/;G}' > fichier.txt

mais je supprime trop de choses à chaque fois...

merci beaucoup messieurs les bons en ça :D

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    Pour ce qui est de supprimer le "#" et éventuellement la ligne vide qui suit, ceci devrait faire l'affaire :

    sed '/^#/{N;/^#\n$/d;D}'

    Après pour ce qui est du reste, il te faudra passer par du bash combiné à du sed et/ou d'autres outils...
    1. cela fonctionne bien merci

      Pour le reste, c'est fort délicat.
      J'avais essayé avec un head puis un cut et enfin un sed, mais le résultat n'est absolument pas fiable :(

      dommage
  2. Modérateur
    Salut,

    Comme ça?!

    ~$ cat fichier.txt                 
    #
      blabla (bla). -  blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    ~$ perl -pi.orig -e 's/.*\n// if $.==1&&/^#/ or $.==2&&/^$/;/^\s*(\w.*\))/;$h{$1}++ if $1;s/^.*-\s+//;END{rename($ARGV,keys %h)}' fichier.txt
    ~$ cat fichier.txt                     
    cat: fichier.txt: Aucun fichier ou dossier de ce type
    ~$ cat blabla\ \(bla\)                     
    blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    ~$ cat fichier.txt.orig                     
    #
      blabla (bla). -  blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    lami20j@debian-acer:~$ 
    lami20j@debian-acer:~$ 
    ~$ cat fichier2.txt                     
    #
    
      2blabla (bla). -  2blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    ~$ perl -pi.orig -e 's/.*\n// if $.==1&&/^#/ or $.==2&&/^$/;/^\s*(\w.*\))/;$h{$1}++ if $1;s/^.*-\s+//;END{rename($ARGV,keys %h)}' fichier2.txt
    ~$ cat fichier2.txt                     
    cat: fichier2.txt: Aucun fichier ou dossier de ce type                         
    ~$ cat 2blabla\ \(bla\)                     
    2blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    ~$ cat fichier2.txt.orig                     
    #
    
      2blabla (bla). -  2blablabla. blabla-blabla.
    blablablabalbalbalba
    blablablablablabal
    ~$