Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 20/01/2011, à 00:18

ridfa

Re : Manipulation de fichier texte [Résolu]

ehmicky

tu es trop bon merci cool
voilà ou j'en suis (j'ai intégré ce que tu m'as donné tongue )

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 cool
Je continue à bosser...
L'idée étant de demander où enregistrer le fichier de sortie et choisir le nom smile

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 sad

Hors ligne

#27 Le 20/01/2011, à 00: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, à 01:02)

Hors ligne

#28 Le 20/01/2011, à 01:52

FRUiT

Re : Manipulation de fichier texte [Résolu]

Levi59 a écrit :
${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, à 01: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, à 04:14

ridfa

Re : Manipulation de fichier texte [Résolu]

Un grand merci à vous smile

Hors ligne

#30 Le 20/01/2011, à 08: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, à 08: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, à 10: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, à 11:38

Levi59

Re : Manipulation de fichier texte [Résolu]

Totor a écrit :

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, à 20: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 hmm )

Voilà ce qu'est devenu le script, tous les avis et commentaires sont les bienvenus ! smile

#!/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 cool

Hors ligne

#35 Le 21/02/2011, à 21: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, à 21:53

ridfa

Re : Manipulation de fichier texte [Résolu]

Salut Levi smile

Merci j'applique ça tout de suite

Et merci de te pencher sur le reste ! wink

@+

Hors ligne

#37 Le 21/02/2011, à 22: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, à 22:59)

Hors ligne

#38 Le 21/02/2011, à 23:22

ridfa

Re : Manipulation de fichier texte [Résolu]

Levi,
J'ai essayé avant de chercher à comprendre les modifs, j'avoue tongue
mais je ne vois pas l'info reprenant le nombre de lignes modifiées dans la fenêtre de résultat final sad

Merci pour la piste wink
ça veut dire que c'est possible ! big_smile

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, à 23:41)

Hors ligne

#39 Le 21/02/2011, à 23: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, à 23:58

ridfa

Re : Manipulation de fichier texte [Résolu]

big_smile ça marche !!

Merci Levi cool

edit : trop pressé j'avais pas les explications du comptage, t'es un prince smile
edit2 : J'ai envie de dire ça déglingue !! big_smile

Dernière modification par ridfa (Le 22/02/2011, à 00:00)

Hors ligne

#41 Le 22/02/2011, à 00: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! cool Mais continue de m'appeler prince quand même! lol

Hors ligne

#42 Le 22/02/2011, à 00: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 22/02/2011, à 00:05)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#43 Le 22/02/2011, à 00:06

ridfa

Re : Manipulation de fichier texte [Résolu]

De ma perspective c'est énorme ! Et oui dommage pour le smiley. lol

C'est sûr que Prince Levi, ça claque roll

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 big_smile

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 22/02/2011, à 00:08)

Hors ligne

#44 Le 22/02/2011, à 00: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 à

Hizoka a écrit :

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 !
smile Il est content Rosco!

edit : même s'il va falloir du temps pour je digère tout ça !
edit2 : Ca marche !! big_smile

Dernière modification par ridfa (Le 22/02/2011, à 01:36)

Hors ligne

#45 Le 22/02/2011, à 04:18

YannUbuntu

Re : Manipulation de fichier texte [Résolu]

petite question pour info :

Hizoka a écrit :

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, à 04: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, à 04:24)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#47 Le 22/02/2011, à 08: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 wink

Dernière modification par YannUbuntu (Le 22/02/2011, à 08:05)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#48 Le 22/02/2011, à 10:51

ridfa

Re : Manipulation de fichier texte [Résolu]

Salut @ tous,

Je cherche à comprendre ce qui est fait par ce code

Hizoka a écrit :
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, à 10:56)

Hors ligne

#49 Le 22/02/2011, à 11: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, à 12:19

ridfa

Re : Manipulation de fichier texte [Résolu]

Salut Prince Levi big_smile

Merci pour ton mémo, j'avoue que c'est la classe cool et sympa de ta part wink

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