#1 Le 18/05/2008, à 21:15
- grobs
[Script shell] Opérations sur des fichiers + regex
Bonjour chers ubuntu-users
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 ), 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
"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
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
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
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...
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é :
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
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