Pages : 1
#1 Le 12/10/2012, à 05: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
Dernière modification par Hizoka (Le 21/10/2012, à 14:11)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 12/10/2012, à 07: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, à 08:01)
Hors ligne
#3 Le 12/10/2012, à 08:01
- Hizoka
Re : encore du sed et awk
merci
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 12/10/2012, à 08: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, à 08:05
- Hizoka
Re : encore du sed et awk
c'est parfait !
merci beaucoup à toi !!
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 12/10/2012, à 08: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"
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 13/10/2012, à 21:15
- Hizoka
Re : encore du sed et awk
Un petit up
merci
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 14/10/2012, à 07:48
- pingouinux
Re : encore du sed et awk
Bonjour,
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, à 20:17
- Hizoka
Re : encore du sed et awk
parfait !!
merci infiniment !
Il me manquait plus que ca pour terminer mon module
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#10 Le 21/10/2012, à 14:10
- Hizoka
Re : encore du sed et awk
arf !
il me faut encore modifier le code
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
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#11 Le 21/10/2012, à 21: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, à 22:15
- Hizoka
Re : encore du sed et awk
le probleme c'est que les variables mon_paquet et mon_texte change tout le temps....
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#13 Le 21/10/2012, à 22: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, à 22: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 !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#15 Le 22/10/2012, à 00: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 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
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#16 Le 22/10/2012, à 07:48
- Hizoka
Re : encore du sed et awk
merci beaucoup pour ces commandes
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 !
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
Pages : 1