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.

#1 Le 18/05/2008, à 21:15

grobs

[Script shell] Opérations sur des fichiers + regex

Bonjour chers ubuntu-users smile

Je cherche à faire une fonction me permettant de faire ceci (script sh) :
1) Suppression de toutes les lignes entre la première et la dernière ligne d'un fichier
2) Suppression de caractères aléatoires suivant un masque (regex)

Je fais pas mal de php et je sais ce que vous aurez envie de me dire : rtfm, ou encore en termes profane : débrouilles-toi, mais si personne ne veut me faire le script (ce que je comprendrai tout à fait wink ), donnez-moi au moins des pistes.

Je connais pas mal de choses sur bash mais j'ai jamais scripté en shell et ça m'intéresserai d'en savoir plus, et comme c'est en faisant qu'on devient faiseron et bien c'est pourquoi je viens vous poser ces questions aujourd'hui !

Merci d'avance smile


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#2 Le 18/05/2008, à 21:28

geenux

Re : [Script shell] Opérations sur des fichiers + regex

1) Soit avec sed:

cat fichier|sed -n '9,13 p'

affichera les lignes entre 9 et 13, soit avec une association de head et de tail:

cat fichier|head -13|tail -5

affichera toutes les lignes entre 9 et 13

2) sed encore : sed '/[a-e]//g' supprimera tous les lettres comprises entre a et e

Hors ligne

#3 Le 18/05/2008, à 21:33

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Waw, quelle réponse rapide et efficace smile
Super merci bien !!
Donc sed est une fonction bien intéressante à ce que je vois.

Puis-je mettre des mots ou expressions à la place de ton "a" et "e" dans ton exemple ? Ou encore faire de la même manière que précédemment mais non plus en nombre de lignes mais en nombre de caractères.

Merci encore !

Dernière modification par grobs (Le 18/05/2008, à 21:41)


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#4 Le 18/05/2008, à 21:40

Alain.g

Re : [Script shell] Opérations sur des fichiers + regex

Pour supprimer toutes les lignes entre la première et la dernière : sed -n '1p;$p'
concrètement on affiche juste la première (1p) et la dernière ($p)


Xubuntu Karmic !

Hors ligne

#5 Le 18/05/2008, à 22:09

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Quand je fais

cat $HOME/MonSuperFichier|sed -n '1p;$p'|sed '/[c-t]//g'

ça me renvoie l'erreur suivante :

sed: -e expression n°1, caractère 8:
commande inconnue: `/'

Je ne vois pas à quoi sert //g. Le manuel me dit :

g G     Copy/append hold space to pattern space

J'ai essayé de faire

cat $HOME/MonSuperFichier|sed -n '1p;$p'|sed '/[c-t]//g'

Mais là du coup ça ne m'affiche plus rien (alors que dans mon fichier il y a bien des choses à l'extérieur de [c-t].

Auriez-vous une idée ?

Dernière modification par grobs (Le 18/05/2008, à 22:12)


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#6 Le 18/05/2008, à 22:19

garnier

Re : [Script shell] Opérations sur des fichiers + regex

Bonsoir,

il est possible de vider entierement un fichier au moyen des deux commandes suivantes :

cat /dev/null > mon_fichier

ou

> mon_fichier

cordialement benoit

#7 Le 18/05/2008, à 22:23

Alain.g

Re : [Script shell] Opérations sur des fichiers + regex

il manque le premier s
la bonne syntaxte serait : sed 's/[c-t]//g'

"g" signifie  "global", pour remplacer toutes les occurences

une introduction pas mal à sed :
http://www.commentcamarche.net/faq/sujet-9536-sed-introduction-a-sed-part-i

Dernière modification par Alain.g (Le 18/05/2008, à 22:27)


Xubuntu Karmic !

Hors ligne

#8 Le 19/05/2008, à 17:27

geenux

Re : [Script shell] Opérations sur des fichiers + regex

Autant/Au temps pour moi, comme l'a indiqué Alain.g, j'ai oublié le s...

Hors ligne

#9 Le 19/05/2008, à 18:29

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Ok merci smile
J'ai encore quelques questions :
Dans les deux lignes sélectionnées j'ai besoin de n'afficher que les expressions d'heure de la forme (exemple) :

(23:14:26)

ce qui correspondrait à un masque regex ressemblant à cela :

grep '^([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\})'

Y aurai-t-il un moyen pour raccourcir un peu cette expression ? En PHP j'aurais fais :

'\(([0-9]{2}\:){2}[0-9]\)'

mais ça n'a pas l'air de fonctionner...

Mais le problème principal n'est pas là à la limite. Ce que je veux c'est n'afficher QUE ce qui correspond au masque définit et donc sans le reste de la ligne où se trouve l'expression trouvée. Comment pourrais-je faire ça ?

Merci d'avance

Dernière modification par grobs (Le 19/05/2008, à 18:38)


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#10 Le 19/05/2008, à 18:37

geenux

Re : [Script shell] Opérations sur des fichiers + regex

cat fichier|grep -E "\([0-9]{2}\:[0-9]{2}\:[0-9]{2}\)"

Je n'ai pas réussi à raccourcir ça...

Hors ligne

#11 Le 19/05/2008, à 18:41

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Ok, j'ai trouvé :

grep -E '\(([0-9]{2}:){2}[0-9]{2}\)'

Merci pour la petite option E bien pratique smile
Pour ce qui est de l'affichage seulement du masque, aurai-tu une idée ? Si oui je suis preneur ^^
J'ai trouvé :

grep -Eo '\(([0-9]{2}:){2}[0-9]{2}\)'

J'avance, j'avance... tongue

Maintenant j'aurais besoin de pouvoir lancer ma commande (admettons MaSuperCommande) avec un argument et que je puisse réutiliser cet argument dans la fonction ensuite. Par exemple :

$ MaSuperCommande argument1

Puis réutiliser "argument1" dans le script.

Comment faire ? Quelle variable est associée à l'argument ?

EDIT : j'ai cru comprendre que j'aurais à faire à read mais je vois pas trop là... J'aurais dû faire du C, j'aurais dû ! ^^

EDIT 2 : C'est bon, trouvé cool :

read Variable1

Maintenant le problème se corse un peu. Là j'applique ça à un fichier mais j'aimerai faire une bucle sur ma fonction et appliquer la commande à tous les fichiers d'un dossier donné.

Comment faire ?

Dernière modification par grobs (Le 19/05/2008, à 19:16)


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#12 Le 19/05/2008, à 19:16

geenux

Re : [Script shell] Opérations sur des fichiers + regex

dans ton script: $1 représente l'argument 1, $2 le deuxième....
par exemple:

echo "$1 $2"

que tu lance avec

./script test1 test2

retournera

test1 test2

Hors ligne

#13 Le 19/05/2008, à 19:18

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Merci bien, je venais de trouver une solution avec read.
Je remet ici ma dernière question :

Là j'applique ça à un fichier mais j'aimerai faire une bucle sur ma fonction et appliquer la commande à tous les fichiers d'un dossier donné.

Comment faire ?


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#14 Le 19/05/2008, à 19:22

geenux

Re : [Script shell] Opérations sur des fichiers + regex

for fichier in $(ls /lien/vers/ton/dossier);do
     echo $fichier
done

Bien sur tu fait ce que tu veut avec les noms de fichiers et tu change le lien vers le dossier.

Hors ligne

#15 Le 19/05/2008, à 19:42

grobs

Re : [Script shell] Opérations sur des fichiers + regex

Super, merci ! Je vais étudier ça big_smile
A bientôt pour de nouvelles questions ^^


"Mieux vaut vérifier que les enceintes sont bien branchées avant de recompiler un noyau". (vieux proverbe de Debianneux)

Hors ligne

#16 Le 20/05/2008, à 15:23

Saito

Re : [Script shell] Opérations sur des fichiers + regex

for fichier in /lien/vers/ton/dossier/* ;do
     echo $fichier
done

plutôt.


Aku-Soku-Zan_Shinsengumi

Hors ligne