Sed et l'horloge en référence ?

Résolu/Fermé
neo - 16 août 2007 à 20:29
 neo - 31 août 2007 à 00:38
Bonjour à tous, mon souçis est le suivant :

J'ai un fichier texte contenant plusieurs lignes que je dois modifier pour être utiliser dans un autre soft.

Dans ce fichier j'ai des dates et heures, j'aimerai avec Sed, avoir comme référence l'horloge du pc, et pouvoir éffacer toutes les lignes de mon txt ou l'heure du pc ne correspond pas.

Exemple : Mon horloge affiche 20:30, je veux supprimer toutes les lignes du txt ou il n'est pas écrit 20:30.

J'ai chérché mais je ne trouve rien, je peux afficher la l'horloge avec "Date" mais c'est tout, notez aussi que je débute.

Je travaille avec Cygwin pour Windows.
Vos réponses seront les bienvenues et d'un grand secours.
Merci
A voir également:

7 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
16 août 2007 à 20:45
Salut,

Essaie ça :
sed '/'$(date "+%H:%M")'/d' fichier.txt
;-))
0
Je suis plus que débutant :)

Mon fichier texte ressemble à cela

#1#"15/08/2007"#"14:30"#1#358#31
#1#"15/08/2007"#"15:27"#1#358#31
#1#"15/08/2007"#"16:48"#1#358#31
#1#"15/08/2007"#"18:14"#1#358#31


etc etc..

je le modifie avec cette commande : sed -e 's/#/\&=/g' -e 's/"//g'

Ce qui à pour effet de me supprimer les " et de me remplacer les # par &=

Quand j'ajoute la ligne que tu viens de me donner Jipicy, donc :

$ sed '/'$(date "+%H:%M")'/d' fichier.txt -e 's/#/\&=/g' -e 's/"//g' fichier.t
xt>fichier2.txt

Il me dit en erreur : Can't read 21:20/d: no such file or directory

La bonne nouvelle c'est que deja cela fonctionne, il prend en compte mon horloge ! :D
La mauvaise ... vois bien que ça cloche mais je ne vois pas ou ...

A quoi donc sert le d' dans ta ligne ? je ne trouve pas :(

Merci de ton aide
0
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
16 août 2007 à 22:22
Oups sorry j'ai fait une erreur, j'avais compris que tu voulais effacer toutes les lignes correspondants à l'heure, donc tu l'auras compris le "d" sert à effacer la (les) ligne(s) en question.

Donc essayes comme ça :
sed '/'$(date "+%H:%M")'/!d' -e 's/#/\&=/g' -e 's/"//g' fichier.txt > fichier2.txt 
le "!" devant le "d" exprime la négation, donc toutes les lignes qui ne correspondent pas à l'heure ne seront pas envoyées dans le fichier.

;-))
0
Toujours le même probléme, message d'erreur : sed: can't read 23:05: No such file or directory

Il essaye de lire un fichier qui se nome 23:05 ?

N'y aurai t'il pas une histoire d'eccho pour afficher la dite heure ? je suis perdu j'avoue :p

En tout cas merci beaucoup de ton aide Jipicy :)
0
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 > neo
16 août 2007 à 23:06
T'as bien tapé la même ligne que je t'ai mise au post précédent ?

Quel shell utilises-tu ?
0
neo > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
16 août 2007 à 23:12
Shell ? Qu'entend tu par Shell ? navré mais je débute réellement. Je suis sous Windows XP et j'utilise Cygwin.

GNU bash, version 3.2.17(15)-release (i686-pc-cygwin)

Sinon oui j'ai tappé exactement la même chose.
0
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 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
16 août 2007 à 23:26
Shell c'est l'interpréteur de commande, "bash" dans ton cas comme tu l'as noté...

Bon essaye ça alors :
sed '/'$(date "+%H:%M")'/!d; s/#/\&=/g; s/"//g' fichier.txt
On supprime les "-e" qui apparemment fichent la zone et on les remplace par des ";".

;-))
0
neo > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 août 2007 à 00:38
Tu es un chef Jipicy, non seulement parce que ça fonctionne, mais surtout pour l'attention que tu as bien voulu porter à mon probléme !

Un grand merci à toi !

ps : je saurai ou sonner la prochaine fois que je buterai sur un probléme :p
0
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
17 août 2007 à 17:06
Bon on va essayer de te dépatouiller un peu...

Déjà tu l'as très bien déduit d'ailleurs, effectivement pour "sed" si dans le motif recherché il y a des "/" ça fiche un peu le boxon, donc il suffit de changer le caractère séparateur de "sed". Exemple :
sed 's|motif|chaine|' fich
ou tout autre caractère ne se trouvant pas dans les motif (ou la chaine de remplacement).

Ensuite concernant les dates (autant inclure directement dans le format les mêmes caractères se trouvant dans le motif à rechercher, autrement dit un "#" (dièse) et un ' " ' (guillemet)) :

date + heure (- 45 minutes) :
date "+%d/%m/%y\"#%H:%M" --date="-45 minutes"

date + heure (+ 45 minutes) :
date "+%d/%m/%y\"#%H:%M" --date="+45 minutes"

A toi de t'arranger avec ça pour faire ta recherche, mais ça va pas être coton ;-((

Bon courage ;-))
0
Effectivement ce n'est pas simple, aprés plusieurs tests une question me vient à l'ésprit :

Si mon horloge affiche 16h00, et que je lui retranche -45 minutes

date "+%d/%m/%y\"#%H:%M" --date="-45 minutes"

Est ce qu'il va prendre en compte la tranche horaire de 15h15 à 16h, ou bien est ce qu'il comprend qu'il doit chercher 15h15 pile ? Car si il cherche 15h15 c'est la cata :)

( Je viens de tenter de vérifier mais j'ai rien du tout dans mon fichier de sortie )

C'est d'autant plus étrange que Sed ne m'affiche pas de message d'erreur, c'est juste que mon fichier de sortie est vide :p

Pour simplifier je commence par changer mes "/", sinon je n'y arrive pas :

sed 's|/|:|' fichier1>fichier2

Ensuite je reprend mon fichier 2 et je fais ma comparaison avec la date en retranchant 45 minutes pour le moment car je ne sais pas encore comment integrer la ligne pour ajouter 45 minutes ;p

sed '/'$(date "+%d:%m:%y\"#%H:%M" --date="-45 minutes")'/!d fichier2>fichier3

Donc tout va bien, pas d'erreur, mais mon fichier est vide, il ne me sort rien pour 15h15 précise, ni pour la tranche horaire de 15h15 a 16h00

Je continue de chercher ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
19 août 2007 à 18:10
Effectivement ce n'est pas simple,

Ça je t'avais prévenu ;-))

aprés plusieurs tests une question me vient à l'ésprit :
Si mon horloge affiche 16h00, et que je lui retranche -45 minutes
date "+%d/%m/%y\"#%H:%M" --date="-45 minutes"
Est ce qu'il va prendre en compte la tranche horaire de 15h15 à 16h, ou bien est ce qu'il comprend qu'il doit chercher 15h15 pile ? Car si il cherche 15h15 c'est la cata :)


Ben non il ne prendra pas l'intervalle, mais l'heure avec les 45 minutes soustraites :
$ date "+%d:%m:%y-%H:%M"
19:08:07-17:58

$ date "+%d:%m:%y-%H:%M" --date="-45 minutes"
19:08:07-17:13
$ 

Pour simplifier je commence par changer mes "/", sinon je n'y arrive pas :
sed 's|/|:|' fichier1>fichier2


Ben c'est pas nécessaire, suffit de composer toutes tes commandes "sed" avec des pipes ( | ) à la place des slashs ( / ), puis à garder ta ligne, rajoute le "g" final pour global, dans tes dates dans ton fichier il y a 2 slashs, ta syntaxe actuelle ne remplace que le 1er... donc :

sed 's|/|:|g' fichier1>fichier2


Ensuite je reprend mon fichier 2 et je fais ma comparaison avec la date en retranchant 45 minutes pour le moment car je ne sais pas encore comment integrer la ligne pour ajouter 45 minutes ;p

C'est là que ça se corse ;-((
il faudrait faire intervenir des variables qui récupéreraient "M+45" et "M-45" pour pondre une expression régulière qui intégrerait l'intervalle de recherche, mais bon ça je sais même pas si c'est faisable ;-))


sed '/'$(date "+%d:%m:%y\"#%H:%M" --date="-45 minutes")'/!d fichier2>fichier3

Donc tout va bien, pas d'erreur, mais mon fichier est vide, il ne me sort rien pour 15h15 précise, ni pour la tranche horaire de 15h15 a 16h00


Est-ce qu'au moins une ligne du fichier d'entrée comprend une date et une heure correspondant à 15h15 ???


Je continue de chercher ;)

Bon courage ;-))
0
Ok je n'avais pas compris que les pipes pouvaient remplacer les slashs :)
Le g je ne l'ai pas écrit mais il est présent dans ma ligne. La ou ça va bloquer c'est justement la tranche horaire, car j'en ai vraiment besoin, en fait si dans mon fichier il est affiché 16h00, je dois pouvoir l'avoir dans mon fichier de sortie 45 minutes avant 16h00, et encore 45 minutes aprés 16h00, donc si tu me dis que ce n'est pas faisable, je vais me diriger vers autre chose, mais je ne vois pas encore quoi ;(

Sinon oui j'ai modifié mon fichier pour qu'il y est 15:15 dedans, mais il ne le voit pas, je vais me pencher la dessus, et je tenterai de completer avec autre chose ou de trouver une solution intermédiaire pour la tranche horaire.

Encore merci à toi, et chapeau bas pour tes connaissances sur Sed.
0
Encore moi !

Alors voila, j'essaie d'inclure la commande expr que je viens de découvrir, et bien évidemment ça ne fonctionne pas, sauf quand je test tout bettement $ expr 3 + 2
La pas de souçis j'ai bien 5 qui s'affiche sur la sortie standard, aprés plusieurs essais j'avais dans mon fichier de sortie ce symbole ਵ.

Et la je viens donc de tester en dehors de mon script: $ expr 2 + 3 >fichier.txt

Et hop je me retrouve avec un Fichier.txt qui contient comme resultat, devinez quoi ? ਵ
Mais qu'est ce donc ? C'est une imcompatibilité Cygwin/Windows ? Ce symbole est en fait le chiffre 5 ?

J'ai tenté de ré-enregistrer mon txt en utilisant le code UTF-8 mais rien n'y fait :/
0