Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 12/10/2012, à 06:51

Hizoka

encore du sed et awk

Bonjour !

Je viens vers vous pour demander un peu d'aide...

Voici un exemple de fichier sur lequel je travaille :

poupou (0.0.1~ppa1~precise) precise; urgency=low ()

  * blublu de bugs
  * blabla

 -- Belleguic Terence <hizo@free.fr>  Fri, 12 Oct 2012 06:39:46 +0200


poupou (0.0.0~ppa1~precise) precise; urgency=low ()

  * Correction de bugs
  * Amelioration du systeme de la barre de progression
  * Suppression du Service Menu et du script Nautilus car : clic droit > ouvrir avec, affiche le logiciel

 -- Belleguic Terence <hizo@free.fr>  Fri, 12 Oct 2012 06:29:46 +0200


mkv-extractor-gui (4.8.0~ppa1~lucid) lucid; urgency=low ()

  * Ajout des dépendances python-webkit imagemagick mclean mkvalidator
  * Suppression du systray qui en prévision du passage a gtk3
  * Mise à jour de glade2script
  * Mise à jour du système de préférence
  * Remise en place du service menu ou du script nautilus
  * Et d'autres choses...

 -- Belleguic Terence <hizo@free.fr>  Tue, 24 Jul 2012 00:35:07 +0200


mkv-extractor-gui (4.7.2~ppa2~precise) precise; urgency=low ()

  * Refonte du systeme du systray
  * Ajout d'une option pour utiliser le même dossier de sortie que celui d'entrée
  * Correction de l'ouverture des fichiers contenant un &
  * Correction de l'icone de la zone de notification
  * Mise à jour de glade2script
  * Utilisation de mktemp pour plus de securite
  * Mise à jour des texte FR et US
  * Ajout de la prise en charge d'unity pour la zone de notification
  * Ajout de la langue Tcheque

 -- Belleguic Terence <hizo@free.fr>  Mon, 23 Jul 2012 18:50:10 +0200

Soit la variable :
nom_paquet=mkv-extractor-gui  OU nom_paquet=poupou

Voila ce que je voudrais faire :
1) Récupérer la version logiciel de nom_paquet :

mkv-extractor-gui (4.8.0~ppa1~lucid) lucid; urgency=low ()

OU

poupou (0.0.1~ppa1~precise) precise; urgency=low ()

pour cela je fais :

sed -n "/${nom_paquet}/ s/${nom_paquet} .\(.*\)~ppa.*/\1/p" fichier | head -1

y a-t-il moyen de virer le head sans trop compliquer ?


2) Récupérer le texte commençant par des étoiles du 1er bloc de nom_paquet
et la, je bloque...
Avant (je n'avais qu'un seul nom de paquet par fichier) je faisais ca :

awk 'BEGIN {RS="\n\n";FS="\n"} (NR==2) { for(i=1; i < NF; i++) {printf substr($i,5)"@@"} printf substr($NF,5) }' fichier

qui séparait les bloc via les sauts de lignes.
J'ai également besoin des substitutions qui changent les sauts de ligne en @@.


Voila, merci smile

Dernière modification par Hizoka (Le 21/10/2012, à 15:11)

Hors ligne

#2 Le 12/10/2012, à 08:34

pingouinux

Re : encore du sed et awk

Bonjour,

y a-t-il moyen de virer le head sans trop compliquer ?

sed -n "/${nom_paquet}/ s/${nom_paquet} (\(.*\)~ppa.*/\1/p;T;q" fichier

S'il n'y a pas concordance : T envoie à la fin
Sinon, on quitte

Récupérer le texte commençant par des étoiles du 1er bloc de nom_paquet

awk '/'$nom_paquet'/{getline;RS="\n\n";FS="\n";getline;{ for(i=1; i < NF; i++) {printf substr($i,5)"@@"} printf substr($NF,5)"\n" }exit}' fichier

Dernière modification par pingouinux (Le 12/10/2012, à 09:01)

Hors ligne

#3 Le 12/10/2012, à 09:01

Hizoka

Re : encore du sed et awk

merci smile

Hors ligne

#4 Le 12/10/2012, à 09:03

pingouinux

Re : encore du sed et awk

J'ai complété ma réponse au moment où tu répondais.

Hors ligne

#5 Le 12/10/2012, à 09:05

Hizoka

Re : encore du sed et awk

c'est parfait !

merci beaucoup à toi !!

Hors ligne

#6 Le 12/10/2012, à 09:08

Hizoka

Re : encore du sed et awk

une derniere question,

un awk qui me permettrait de changer le texte commencant par des etoiles avec un autres texte ?

awk -v OCC=1 -v var="${cacavar}" 'BEGIN{ OLDRS=RS;RS="\n\n\n" } NR==OCC {printf("%s\n\n\n",var);RS=OLDRS} NR!=OCC' "${changelog}" > "${changelog}-new"

Hors ligne

#7 Le 13/10/2012, à 22:15

Hizoka

Re : encore du sed et awk

Un petit up smile

merci

Hors ligne

#8 Le 14/10/2012, à 08:48

pingouinux

Re : encore du sed et awk

Bonjour,

Hizoka #6 a écrit :

un awk qui me permettrait de changer le texte commencant par des etoiles avec un autres texte

S'agit-il de ce texte ?

Récupérer le texte commençant par des étoiles du 1er bloc de nom_paquet

Si oui :

nom_paquet=mkv-extractor-gui

mon_texte='Ligne n°1 de mon texte
Ligne n°2 de mon texte
Ligne n°3 de mon texte'

awk -v mon_texte="$mon_texte" '{if(/^'"$nom_paquet"' /&&!deja){print;getline;print;ORS_=ORS;RS_=RS;ORS=RS="\n\n";getline;print mon_texte;deja=1;ORS=ORS_;RS=RS_}else{print}}' fichier

Hors ligne

#9 Le 14/10/2012, à 21:17

Hizoka

Re : encore du sed et awk

parfait !!

merci infiniment !

Il me manquait plus que ca pour terminer mon module smile

Hors ligne

#10 Le 21/10/2012, à 15:10

Hizoka

Re : encore du sed et awk

arf !

il me faut encore modifier le code tongue

Il me faut donc toujours rechercher un bloc a partir d'un nom, mais le rempacement ne doit pas se limiter au texte etoilé mais à tout le bloc.

Donc, si je cherche mkv-extractor-gui :

mkv-extractor-gui (4.8.0~ppa1~lucid) lucid; urgency=low ()

  * Ajout des dépendances python-webkit imagemagick mclean mkvalidator
  * Suppression du systray qui en prévision du passage a gtk3
  * Mise à jour de glade2script
  * Mise à jour du système de préférence
  * Remise en place du service menu ou du script nautilus
  * Et d'autres choses...

 -- Belleguic Terence <hizo@free.fr>  Tue, 24 Jul 2012 00:35:07 +0200

Désolé et merci smile

Hors ligne

#11 Le 21/10/2012, à 22:56

pingouinux

Re : encore du sed et awk

Bonsoir,
Une solution en python :

$ cat remplacement.py
#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

mon_paquet='mkv-extractor-gui'
mon_texte='''Ligne n°1 de mon texte
Ligne n°2 de mon texte 
Ligne n°3 de mon texte'''

with open(sys.argv[1],'r') as f : txt=f.read()

sys.stdout.write( re.sub('(?m)^%s.*\n\n(  \*.*\n)+\n --.*$'%mon_paquet,mon_texte,txt,count=1) )

Utilisation :

./remplacement.py fichier

Hors ligne

#12 Le 21/10/2012, à 23:15

Hizoka

Re : encore du sed et awk

le probleme c'est que les variables mon_paquet et mon_texte change tout le temps....

Hors ligne

#13 Le 21/10/2012, à 23:23

pingouinux

Re : encore du sed et awk

$ cat remplacement.py
#! /usr/bin/python
# -*- coding: utf-8 -*-

import sys, re

with open(sys.argv[1],'r') as f : txt=f.read()
mon_paquet=sys.argv[2]
mon_texte=sys.argv[3]

sys.stdout.write( re.sub('(?m)^%s.*\n\n(  \*.*\n)+\n --.*$'%mon_paquet,mon_texte,txt,count=1) )

Utilisation :

./remplacement.py fichier mkv-extractor-gui 'Ligne n°1 de mon texte
Ligne n°2 de mon texte 
Ligne n°3 de mon texte'

Hors ligne

#14 Le 21/10/2012, à 23:57

Hizoka

Re : encore du sed et awk

Bon j'ai fait autrement car ca me derangait d'obliger d'utiliser python (et donc son installation) pour un logiciel tout en bash...

voila ma solution :

nom_paquet="mkv-extractor-gui"
tout=$(< "${changelog}")
tout_jusqua_mkv="${tout%%${nom_paquet}*}"
tout_apres_mkv="${nom_paquet} ${tout#*${nom_paquet} }"
tout_apres_mkv="${tout_apres_mkv#*$'\n\n\n'}"

echo "${tout_jusqua_mkv}mkv-extractor-gui blabla
  * blbabla
  * ...

${tout_apres_mkv}
" > "${changelog}"

pas forcement tres rapide ou des plus simple, mais ca devrait marcher en se passant de python.

En tout cas, pingouinux, je te remercie ENORMEMENT pour le temps passé à me lire et à essayer de m'aider !!!
Vraiment merci !

Hors ligne

#15 Le 22/10/2012, à 01:46

nesthib

Re : encore du sed et awk

J'arrive un peu après la bataille mais voici quelques suggestions en awk (parce que awk c'est fun) :

Afficher le numéro de version de la première ligne contenant mkv-extractor-gui :

awk '/^mkv-extractor-gui/{print gensub(/[^ ]* \(([0-9.]+).*/,"\\1", "g") ; exit}' changelog

Récupérer le numéro de version dans la première ligne commençant par mkv-extractor-gui si disponible, sinon dans la première ligne commençant par poupou :

awk '/^mkv-extractor-gui/{if (! v1) {v1=gensub(/[^ ]* \(([0-9.]+).*/,"\\1", "g")}};/^poupou/{if (! v2) {v2=gensub(/[^ ]* \(([^~]+).*/,"\\1", "g")}} END {print (v1?"version1 : "v1:(v2?"version2 : "v2:"Erreur, aucun numéro de version trouvé"))}' changelog

Récupérer le premier bloc commençant par mkv-extractor-gui :

awk '/^mkv-extractor-gui/{start++}; {if (start) {if (newline==2) {exit} ; if (!$0) {newline++} else {newline=0} ; print}}' changelog

ici j'affiche le bloc au fur et à mesure, mais il va de soi que tu peux stocker les lignes dans un tableau et même les modifier. Avec mon exemple tu as 2 lignes vides à la fin mais si tu affiches le contenu de ton tableau dans le bloc « END {…} » tu peux facilement les supprimer.
Pour récupérer un bloc différent (ex. le second) il te suffit de changer le (start) en (start==2).
Pour remplacer les sauts de ligne par « @@ » il suffit également d'ajouter « BEGIN{ORS="@@"} » au début de la commande awk.

Une méthode plus compacte si tu désires juste faire de l'affichage :

awk 'BEGIN{RS="\n\n\n+"} /^mkv-extractor-gui/{print;exit}' changelog

Maintenant si tu veux remplacer spécifiquement ce bloc tout en gardant le reste :

NOUVEAU_BLOC='nouveau bloc\n\n  * au milieu\n\n'
awk '/^mkv-extractor-gui/{start++}; {if (start && newline<2) {if (!$0) {newline++} else {newline=0} ; if (newline==2) {print "'"${NOUVEAU_BLOC}"'"; newline++}} else {print}}' changelog

une variante plus courte :

NOUVEAU_BLOC='nouveau bloc\n\n  * au milieu'
awk 'BEGIN{RS="\n\n\n+";ORS="\n\n\n"} /^mkv-extractor-gui/{$0=(a++?$0:"'"${NOUVEAU_BLOC}"'")};1' changelog

Et si tu veux insérer ton nouveau bloc avant la première occurrence de ton bloc en mkv-extractor-gui (il y a plus simple si l'on se contentait de trouver ce mot clé, mais ici ça vérifie que ce qui suit est bien un bloc. Voir l'exemple suivant) :

NOUVEAU_BLOC='nouveau bloc\n\n  * au milieu\n\n'
awk '/^mkv-extractor-gui/{start++}; {if (start && newline<2) {if (!$0) {newline++} else {newline=0} ; if (newline==2) {print "'"${NOUVEAU_BLOC}"'"; newline++ ; print bloc} ; bloc=bloc$0"\n"} else {print}}' changelog

Même chose sans vérifier que le bloc suit le format attendu :

NOUVEAU_BLOC='nouveau bloc\n\n  * au milieu\n\n'
awk '/^mkv-extractor-gui/{start++;if (start==1) { print "'"${NOUVEAU_BLOC}"'"}}; {print}' changelog

une variante :

NOUVEAU_BLOC='nouveau bloc\n\n  * au milieu\n\n'
awk 'BEGIN{RS="\n\n\n+";ORS="\n\n\n"} /^mkv-extractor-gui/{$0=(a++?"":"'"${NOUVEAU_BLOC}"'\n")$0};1' changelog

Comme quoi awk c'est vraiment génial smile non ?

NB. juste pour être plus sérieux je te signale aussi l'existence de la commande debchange (et de son option -a) qui permet d'éditer les fichiers de changelog tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#16 Le 22/10/2012, à 08:48

Hizoka

Re : encore du sed et awk

merci beaucoup pour ces commandes smile

Je n'arrive vraiment pas à saisir awk, ca me semble tellement compliqué...

Oui j'ai testé debchange, mais le soucis c'est que si tu veux ajouter 25 lignes ca te prends 7sec alors qu'avec un awk ou des echos, ca va bcp plus vite et c'est bien dommage !

Hors ligne

Haut de page ↑