Sed et expression réguliere encore

gLoria -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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...
    0
    1. jean
       
      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
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    ~$        


    0