Sed et expression réguliere encore

Fermé
gLoria - 2 juil. 2010 à 15:26
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 6 juil. 2010 à 21:35
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

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 juil. 2010 à 15:50
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
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 juil. 2010 à 21:35
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