#26 Le 19/01/2011, à 23:18
- ridfa
Re : Manipulation de fichier texte [Résolu]
ehmicky
tu es trop bon merci
voilà ou j'en suis (j'ai intégré ce que tu m'as donné )
fichier=`zenity --file-selection`
read -p 'Nom de fichier final ?' ffichier
a=
while read
do
[[ $REPLY == *http://192.168.1.1* ]]\
&& [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
&& a+="${REPLY/#*http/http}"$'\n'
done <"$fichier"
printf "$a" > $ffichier.txt
Ben ça marche du tonnerre
Je continue à bosser...
L'idée étant de demander où enregistrer le fichier de sortie et choisir le nom
PS : Oserais-je demander un détail pas à pas des actions réalisées par le script ( de do... à ...printf )
je voudrais le décortiquer mais j'avoue patauger
Hors ligne
#27 Le 19/01/2011, à 23:59
- Levi59
Re : Manipulation de fichier texte [Résolu]
a= #définition de l'array $a
while read # Pour chaque ligne placer le contenu de [[1]] dans REPLY
do
[[ $REPLY == *http://192.168.1.1* ]]\ # Si REPLY contient l'adresse ip
&& [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
# Alors : (2nd test) si la précédente boucle n'a pas de résultat identiques
&& a+="${REPLY/#*http/http}"$'\n'
# Alors² ajouter la ligne à la suite de l'array en la débarrassant de tout avant http (NOTE j'aimerais un éclaircissement sur la substitution)
done <"$fichier" # [[1]] fichier qui alimente la boucle et read
printf "$a" > $ffichier.txt # enfin imprimer le contenu de l'array dans ffichier
Dernière modification par Levi59 (Le 20/01/2011, à 00:02)
Hors ligne
#28 Le 20/01/2011, à 00:52
- FRUiT
Re : Manipulation de fichier texte [Résolu]
${REPLY/#*http/http}"$'\n' # Alors² ajouter la ligne à la suite de l'array en la débarrassant de tout avant http (NOTE j'aimerais un éclaircissement sur la substitution)
Il s'agit de la forme bash de la substitution ${VAR/pattern1/pattern2}
Ici en l'occurence remplacer :
du début de la ligne jusqu'au premier 'http' rencontré compris (*http)
par simplement :
'http'.
Dernière modification par FRUiT (Le 20/01/2011, à 00:55)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#29 Le 20/01/2011, à 03:14
- ridfa
Re : Manipulation de fichier texte [Résolu]
Un grand merci à vous
Hors ligne
#30 Le 20/01/2011, à 07:08
- Levi59
Re : Manipulation de fichier texte [Résolu]
Ok tout con en fait... Je croyais que le dièse était une option alors que c'était un simple caractère du motif.
Hors ligne
#31 Le 20/01/2011, à 07:36
- Hizoka
Re : Manipulation de fichier texte [Résolu]
ba oui, le # signifie commancant ou début
${var#*:}
supprime tout du debut jusqu'au 1er :
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#32 Le 20/01/2011, à 09:55
- Totor
Re : Manipulation de fichier texte [Résolu]
Bonjour:
${REPLY/#*http/http}"$'\n'
A noter que l'utilisation du # est inutile du fait de l'emploi du *
-- Lucid Lynx --
Hors ligne
#33 Le 20/01/2011, à 10:38
- Levi59
Re : Manipulation de fichier texte [Résolu]
Bonjour:
${REPLY/#*http/http}"$'\n'
A noter que l'utilisation du # est inutile du fait de l'emploi du *
Oui, c'est aussi pourquoi j'ai cru voir plus compliqué...
Hors ligne
#34 Le 21/02/2011, à 19:25
- ridfa
Re : Manipulation de fichier texte [Résolu]
Bonjour
J'espérais revenir présenter le résultat de mon travail à tous ceux qui m'ont aidé à avancer mais là j'avoue je n'y arriverai pas seul (encore une fois )
Voilà ce qu'est devenu le script, tous les avis et commentaires sont les bienvenus !
#!/bin/bash
fichier=`zenity --file-selection\
--title "Fichier à traiter"\
--filename "dossier_du_fichier_a_traiter"`
if [ "$?" != "0" ]
then exit
fi
destrep=`zenity --file-selection \
--title "Repertoire de destination" \
--text "Où enregistrer le fichier ?" \
--filename "dossier_destination_fichier_final" \
--directory`
if [ "$?" != "0" ]
then exit
fi
ffichier=`zenity --entry \
--title "Nom du fichier final" \
--text "Saisissez le nom du fichier : "`
if [ "$?" != "0" ]
then exit
fi
a=
while read
do
[[ $REPLY == *http://192.168.1.1* ]]\
&& [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
&& a+="${REPLY/*http/http}"$'\n'
done <"$fichier"
printf "$a" > "$destrep/$ffichier.txt"
zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "$destrep/$ffichier.txt"
A la fin du script par ce bout de code
zenity --text-info \
--title "Résultat" \
--width "412" \
--filename "$destrep/$ffichier.txt"
Le script affiche le résultat du fichier final, une sorte d'aperçu pour s'assurer que le fichier final ne comporte pas d'erreurs.
Toujours dans cet état d'esprit, j'aurais aimé faire apparaître dans cette même fenêtre le nombre de lignes traitées en les comptant par la commande wc -l.
Ceci sans forcément créer un fichier temporaire car je n'arrive pas à le faire effacer une fois le script fini.
Est-ce possible ?
D'avance merci
Hors ligne
#35 Le 21/02/2011, à 20:42
- Levi59
Re : Manipulation de fichier texte [Résolu]
Petit commentaire pour revenir sur une réflexion que l'on m'a faites dans un autre topic:
fichier=`zenity --file-selection\
--title "Fichier à traiter"\
--filename "dossier_du_fichier_a_traiter"`
if [ "$?" != "0" ]
then exit
fi
peut être remplacer par:
fichier=`zenity --file-selection\
--title "Fichier à traiter"\
--filename "dossier_du_fichier_a_traiter"` || exit
Second point :
la syntaxe pour définir une variable avec une commande n'est plus recommandé. il faut uiliser $(commande)
ex:
fichier=$(zenity --file-selection\
--title "Fichier à traiter"\
--filename "dossier_du_fichier_a_traiter") || exit
Je me penche sur le reste plus tard ^^
Hors ligne
#36 Le 21/02/2011, à 20:53
- ridfa
Re : Manipulation de fichier texte [Résolu]
Salut Levi
Merci j'applique ça tout de suite
Et merci de te pencher sur le reste !
@+
Hors ligne
#37 Le 21/02/2011, à 21:56
- Levi59
Re : Manipulation de fichier texte [Résolu]
Peut être une idée:
a=
b=0
while read
do
[[ $REPLY == *http://192.168.1.1* ]]\
&& [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
&& {
a+="${REPLY/*http/http}"$'\n'
((b++))
}
done <"$fichier"
printf "$a" > "$destrep/$ffichier.txt"
zenity --text-info \
--title "Résultat" \
--text "${b} lignes ont été modifiées" \
--width "412" \
--filename "$destrep/$ffichier.txt"
exit 0
Dernière modification par Levi59 (Le 21/02/2011, à 21:59)
Hors ligne
#38 Le 21/02/2011, à 22:22
- ridfa
Re : Manipulation de fichier texte [Résolu]
Levi,
J'ai essayé avant de chercher à comprendre les modifs, j'avoue
mais je ne vois pas l'info reprenant le nombre de lignes modifiées dans la fenêtre de résultat final
Merci pour la piste
ça veut dire que c'est possible !
edit : Je me pose une question, comment le script compte t-il les lignes ? je pensais m'appuyer sur wc -l
Je comprends que la variable b est initialisée à zéro puis incrémentée par ((b++)) mais sinon je rame sec !
Dernière modification par ridfa (Le 21/02/2011, à 22:41)
Hors ligne
#39 Le 21/02/2011, à 22:50
- Levi59
Re : Manipulation de fichier texte [Résolu]
a=
b=0
while read
do
[[ $REPLY == *http://192.168.1.1* ]]\
&& [[ $a != *${REPLY#*http://192.168.1.1}* ]]\
&& {
a+="${REPLY/*http/http}"$'\n'
# À chaque ligne modifiée, tu incrémentes de 1 donc tu as le nombre de lignes dans $b
((b++))
}
done <"$fichier"
printf "$a" > "$destrep/$ffichier.txt"
zenity --text-info \
--title "Résultat (${b} lignes ont été modifiées)" \ # Essayons là!
--width "412" \
--filename "$destrep/$ffichier.txt"
exit 0
--text "${b} lignes ont été modifiées" \ # je voulais l'afficher là mais à priori, c'est pas possible
Hors ligne
#40 Le 21/02/2011, à 22:58
- ridfa
Re : Manipulation de fichier texte [Résolu]
ça marche !!
Merci Levi
edit : trop pressé j'avais pas les explications du comptage, t'es un prince
edit2 : J'ai envie de dire ça déglingue !!
Dernière modification par ridfa (Le 21/02/2011, à 23:00)
Hors ligne
#41 Le 21/02/2011, à 23:02
- Levi59
Re : Manipulation de fichier texte [Résolu]
(Dommage qu'il n'y ai pas de smiley avec la tête enflée ^^)
Non c'etait rien! Mais continue de m'appeler prince quand même!
Hors ligne
#42 Le 21/02/2011, à 23:04
- Hizoka
Re : Manipulation de fichier texte [Résolu]
Pourquoi faire :
destrep=`zenity --file-selection \
--title "Repertoire de destination" \
--text "Où enregistrer le fichier ?" \
--filename "dossier_destination_fichier_final" \
--directory`
ffichier=`zenity --entry \
--title "Nom du fichier final" \
--text "Saisissez le nom du fichier : "`
et pas simplement :
zenity --file-selection \
--title "Nom du fichier final" \
--save
De plus la boite file-select ne prend pas l'option text.
Si tu veux faire mumuse avec zenity, regarde ma signature.
Quand tu appelles des variables, entoure les de {} => ${test}
si tu ne connais pas, lis : http://abs.traduc.org/abs-fr
Toujours dans cet état d'esprit, j'aurais aimé faire apparaître dans cette même fenêtre le nombre de lignes traitées en les comptant par la commande wc -l.
Ceci sans forcément créer un fichier temporaire car je n'arrive pas à le faire effacer une fois le script fini.
Est-ce possible ?
Je ne pense pas ça possible car file-name n'ouvre qu'un seul fichier, tu ne peux envoyer plusieurs infos en même temps...
Donc la solution, soit une autre fenêtre indiquant le nombre de ligne
Soit tu comptes le nombre de ligne depuis la variable
tu l'injectes en 1ere ligne de ton fichier final
tu envoies le reste
tu affiches le résultat
et tu supprime la 1ere ligne de ton fichier afin que cela n'apparaisse plus
ligne=$(wc -l <<< "${a}")
echo "${ligne% *}" > "${destrep}/${ffichier}.txt"
echo "${a}" >> "${destrep}/${ffichier}.txt"
zenity....
sed -i '1d' "${destrep}/${ffichier}.txt"
ça complique pas mal pour ça...
edit : Je me pose une question, comment le script compte t-il les lignes ? je pensais m'appuyer sur wc -l
Je comprends que la variable b est initialisée à zéro puis incrémentée par ((b++)) mais sinon je rame sec !
A chaque tour dans la boucle b est incrémenté, donc à la fin si b=50, c'est qu'il y avait 50 lignes...
EDIT : grillé, bien pensé de le foutre dans le titre !! ca evite tout ça !!
Dernière modification par Hizoka (Le 21/02/2011, à 23:05)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#43 Le 21/02/2011, à 23:06
- ridfa
Re : Manipulation de fichier texte [Résolu]
De ma perspective c'est énorme ! Et oui dommage pour le smiley.
C'est sûr que Prince Levi, ça claque
Bon je continue à me creuser pour quelques améliorations et comme d'hab si galère I'll be back
De toute façon je reviendrai
edit : un autre prince est présent je prends le temps de te lire Hizoka (un peu lent le gamin!)
Merci @ vous en tous cas!
Dernière modification par ridfa (Le 21/02/2011, à 23:08)
Hors ligne
#44 Le 21/02/2011, à 23:15
- ridfa
Re : Manipulation de fichier texte [Résolu]
@Hizoka
J'ai lu les pages citées dans ta signature d'où mon aventure vers Zenity mais j'apprends seul (je n'oublie pas votre aide précieuse) et avec peu de connaissance à la base.
Et tout ça me laisse rêveur quand à la suite
Je jette un oeil à ton lien http://abs.traduc.org/abs-fr
Quant à
Pourquoi faire :
destrep=`zenity --file-selection \ --title "Repertoire de destination" \ --text "Où enregistrer le fichier ?" \ --filename "dossier_destination_fichier_final" \ --directory` ffichier=`zenity --entry \ --title "Nom du fichier final" \ --text "Saisissez le nom du fichier : "`
C'est pour lui indiquer un répertoire de destination au choix et préciser le nom du fichier final
Serais-tu en train de me dire que je peux faire tout ça en 3 lignes?
zenity --file-selection \
--title "Nom du fichier final" \
--save
J'essaye ça tout de suite !
Il est content Rosco!
edit : même s'il va falloir du temps pour je digère tout ça !
edit2 : Ca marche !!
Dernière modification par ridfa (Le 22/02/2011, à 00:36)
Hors ligne
#45 Le 22/02/2011, à 03:18
- YannUbuntu
Re : Manipulation de fichier texte [Résolu]
petite question pour info :
Quand tu appelles des variables, entoure les de {} => ${test}
J'ai compris que cette façon de faire sert notamment lorsque la variable est suivie par d'autres caractères (dans une chaine de caractères donc), comme par exemple ci-dessous :
a="ubu"
echo "${a}ntu"
le reste du temps on peut se contenter de $a , non?
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#46 Le 22/02/2011, à 03:23
- Hizoka
Re : Manipulation de fichier texte [Résolu]
il est conseillé de toujours utiliser les {} afin d'être sur de ne pas les zapper...
et c'est plus logique d'utiliser toujours la même façon...
apres, rien "n'oblige" non plus....
avec les {}, tu peux gerer les listes, tu peux modifier tes variables
echo ${var[2]}
echo ${var##*/}
Dernière modification par Hizoka (Le 22/02/2011, à 03:24)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#47 Le 22/02/2011, à 07:05
- YannUbuntu
Re : Manipulation de fichier texte [Résolu]
ok merci. Les listes je connaissais, mais pas la 2eme syntaxe. Pour éviter de polluer trop ce fil, je pose la question dans un autre sujet : http://forum.ubuntu-fr.org/viewtopic.ph … 9#p4009689 , ca pourra servir a d'autres debutants comme moi
Dernière modification par YannUbuntu (Le 22/02/2011, à 07:05)
à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison
Hors ligne
#48 Le 22/02/2011, à 09:51
- ridfa
Re : Manipulation de fichier texte [Résolu]
Salut @ tous,
Je cherche à comprendre ce qui est fait par ce code
ligne=$(wc -l <<< "${a}") echo "${ligne% *}" > "${destrep}/${ffichier}.txt" echo "${a}" >> "${destrep}/${ffichier}.txt" zenity.... sed -i '1d' "${destrep}/${ffichier}.txt"
1er bug
ligne=$(wc -l <<< "${a}")
Je comprends que l'on affecte à la variable ligne la valeur de la commande wc - l qui compte les lignes de la variable a
Là où je bute c'est sur <<< , pourquoi 3< ?
Le peu que j'ai trouvé à ce sujet évoque les expressions étendues (??)
2ème bug
echo "${ligne% *}" > "${destrep}/${ffichier}.txt"
Que signifie le % en fin de variable, je connais le sens de * mais cette association...
edit : Je viens de voir le post de yannbuntu. Y a t-il un rapport avec
${chaine%souschaine}
Supprime la plus petite correspondance de $souschaine à partir de la fin de $chaine.
Encore et toujours Merci :rolleyes:
PS : Quand je me pose ce genre de question, le réflexe c'est google, mais les résultats de ce type de recherche "variable%" ou "variable %" ou autre déclinaison pour trouver un élément de réponse ne prennent pas en compte les caractères recherchés à savoir % ou <<<.
Ceux qui savent ce que cela veut dire ne savaient pas avant de savoir :/ Comment ont-ils su ? Quelles lectures ? Quelqu'un vous l'a dit ?
Voilà ça peut paraitre béta, j'ai hésité avant de poser cette question, j'ai cherché mais rien qui me fait comprendre
Dernière modification par ridfa (Le 22/02/2011, à 09:56)
Hors ligne
#49 Le 22/02/2011, à 10:31
- Levi59
Re : Manipulation de fichier texte [Résolu]
1er bug
Je ne suis pas sûr, je préfère laisser l'explication à quelqu'un qui a bien compris.
2eme bug
On a lut http://abs.traduc.org/abs-fr/ et on a testé...
Je suis gentil je te file mon mémo...
Mémo :
${Var+defined} = Vérifie si Var est définie [set] (différent de vide : -z )
${Var-default value} = Vérifie si Var est non définie [unset] (différent de vide : -z )
${Var##*.} = Supprimer tout jusqu'au dernier point (point compris)
${Var#*.} = Supprimer tout jusqu'au premier point (point compris)
${Var%.*} = Supprimer tout à partir du dernier point (point compris)
${Var%%.*} = Supprimer tout à partir du premier point (point compris)
${#Var} = Nombre de caractères dans la variable.
${#array} = Nombre de caractères du premier élément du tableau.
${#*}, ${#@} = Nombre de paramètres
${#array[*]}, ${#array[@]} = Nombre d'éléments du tableau
${Var:a:b} = afficher "b" caractères à partir du caractère numéro "a"
${Var/a/b} = remplacer la première occurence de "a" par "b"
${Var//a/b} = remplacer toutes les occurences de "a" par "b"
${Var/#a/b} = Si Var commence par "a", remplacer "a" par "b"
${Var/%a/b} = Si Var se termine par "a", remplacer "a" par "b"
${!Var*}, ${!Var@} = affiche le nom des variables commençant par "Var"
${Var:−word} = si Var est null ou non défini, word est renvoyé
${Var:=word} = si Var est null ou non défini, Var prend la valeur word
${Var:?word} = si Var est null ou non défini, message d'erreur (Bash: Var: word)
${Var:+word} = si Var est non null, word est renvoyé
${Var^regex} = met la première lettre de Var en majuscule
${Var^^regex} = met toutes les lettres de Var en majuscule
${Var,regex} = met la première lettre de Var en minuscule
${Var,,regex} = met toutes les lettres de Var en minuscule
Hors ligne
#50 Le 22/02/2011, à 11:19
- ridfa
Re : Manipulation de fichier texte [Résolu]
Salut Prince Levi
Merci pour ton mémo, j'avoue que c'est la classe et sympa de ta part
En regardant le lien que Hizoka suggère à YannUbuntu dans cette discussion
http://forum.ubuntu-fr.org/viewtopic.ph … 9#p4009689
J'ai trouvé ça :
nomfichier=${fichier%.*c} # Supprime le suffixe ".mac" du nom du fichier
#+ ('.*c' correspond à tout ce qui se trouve
#+ entre '.' et 'c', inclus).
Donc si je ne me gourre pas dans mon cas cela veut dire "supprime tout dès le 1er espace une fois le contenu de la variable imprimée" (!?)
Hors ligne