[script bash] quelles commandes utiliser ?

Fermé
the_moon - 13 mars 2005 à 19:23
 The_moon - 16 mars 2005 à 22:45
Bonjour !
Je suis étudiant en IUT d'informatique et j'ai un projet script a réaliser pour dans environ 1 mois.
J'ai quelques questions concernant des commandes que je n'arrive pas à trouver:

- Je souhaiterais créer un fichier texte de plusieurs lignes contenant sur chaque ligne le nom d'un fichier (existant dans un répertoire donné) puis un commentaire que j'aurai choisi. Jusque là pas de problème.
J'aimerais ensuite pouvoir récuperer uniquement le commentaire d'un fichier choisi (j'utilise 'grep' qui me permet de selectionner la bonne ligne, mais il me donne tout le contenu de la ligne, alors que je ne veux récuperer que le commentaire)
Y a t'il un moyen (comme en Java) de récuperer uniquement une partie de la ligne voulue ? Je ne peux pas compter les caracteres car les noms des fichiers sont de différentes longueurs, par contre je peux utiliser un caractère séparateur. Mais quelle commande faut il utiliser ?

exemple: je crée un fichier dans ce genre:
|-------------------------------------------------------|
| fichier_1 commentaire du fichier 1 |
| fichier_2 commentaire du fichier 2 |
| ... ... |
|-------------------------------------------------------|
et je voudrais pouvoir accéder uniquement au commentaire associé au fichier.
Et une fois que j'ai accédé au commentaire voulu, quelle commande permettrait de le modifier sans toucher au début de la ligne ni au reste du fichier texte ?



- deuxième question, mon programme doit demander un répertoire dans lequel effectuer ses traitements. Ce répertoire doit être tapé au clavier par l'utilisateur.
Comment faire pour vérifier si le répertoire entré existe bien ?
Et comment faire pour savoir si ce répertoire est vide ou contient des fichiers (et combien de fichiers il contient) ? (je ne parle pas de la commande 'ls' qui liste le contenu d'un répertoire, mais d'une commande qui permettrait de donner le nombre d'élements qu'il contient)

Merci beaucoup pour vos réponses !
@ +
A voir également:

8 réponses

gbenay Messages postés 61 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 3 mars 2006 11
14 mars 2005 à 11:54
Une autre solution consiste a utiliser "cut" qui permet de couper une ligne en morceau et de choisir le morceau qui convient.
On l'utilise après avoir récupérer la ligne qui t'interesse.


Il faut savoir quel separateur tu emploies entre "fichier_1" et "commentaire du fichier 1"

si c'est l'espace (un seul) on tape la ligne suivante

grep fichier_1 nom_du_fichier | cut -d ' ' -f 2-


ceci signifie
dans la ligne qui contient "fichier_1" je prends tous les elements qui suivent le premier 'espace' (-f 2-)

dans le cas ou tu utilises la tabulation comme separateur tu n'as pas a definir le separateur



grep fichier_1 nom_du_fichier | cut -f 2-



Un man cut t'aideras pour toutes les possibilités.

Bon courage.
3
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
14 mars 2005 à 12:11
Salut,

Oui effectivement, et on aurait pu aussi se servir de "awk", mais le problème c'est que, je cite :
Et une fois que j'ai accédé au commentaire voulu, quelle commande permettrait de le modifier sans toucher au début de la ligne ni au reste du fichier texte ?
Voilà pourquoi "asevere" parlait d'utiliser "sed", il faut pouvoir extraire le commentaire, le modifier et le remplacer sans toucher au reste...
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
13 mars 2005 à 22:00
Tu as aussi l'option -o de grep qui te permet de ne selectionner que la partie qui concerne ton expression régulière.

Par exemple si tu vas dans /etc/init.d et que tu tapes grep -oE '#.*' *
tu auras les commentaires avec le nom du fichier correspondant à chaque occurence de ton expression...
1
gbenay Messages postés 61 Date d'inscription jeudi 16 décembre 2004 Statut Membre Dernière intervention 3 mars 2006 11
14 mars 2005 à 13:08
Salut,

J'avais pas lu toute la question, excuse-moi?

Et une fois que j'ai accédé au commentaire voulu, quelle commande permettrait de le modifier sans toucher au début de la ligne ni au reste du fichier texte ?



Pour repondre completement il me faut plusieurs parametres :
1/ ton commentaire doit-il etre juste modifie ou reecrit ?
2/ la ligne contenant l'information doit-elle etre toujours au meme endroit dans ton fichier?
3/ ton fichier est-il trier (apr exemple sur le nom des fichiers)?

Il faudra toujours passer par des recopies de fichier temporaire car sed ou tout autre commande (sauf les editeurs de texte) utilisent des fichiers en lecture ou en ecriture mais pas les 2. Si tu ne veux pas utiliser de fichier temporaire il faut construire un petit programme en C ou en Java (ou autre) qui puisse ouvrir le fichier en lecture-ecriture.

voici une possibilite si tu reecris completement le commentaire de fichier_1 (par exemple)

sed -e 's/fichier_1\(.*\)/fichier_1 nouveau_commentaire/' nom_fichier > nom_fichier.tmp

rm nom_fichier
mv nom_fichier.tmp nom_fichier


Tu peux creer un fichier script "s1.sh"
de ce genre
#! /bin/bash
echo "s/$1\(.*\)/$1 $2/" > t1.tmp
sed -f t1.tmp $3 > $3.tmp
rm $3
mv $3.tmp $3
rm t1.tmp


et alors il suffit d'ecrire apres avoir modifier en executable ce fichier script

s1.sh fichier_1 nouveau_commentaire nom_fichier
Si tu veux donner plus de liberte il faut permettre d'utilser d'autres valeurs que $1 $2 $3 soit par des read soit par des valeurs figees.

Bon courage.

1
asevere Messages postés 13089 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 426
13 mars 2005 à 19:35
Salut,

Pour le traitement de ton fichier, je dirais sed (man sed) qui te permettra de trouver le commentaire voulu, et de le modifier sans toucher le reste du fichier.

Pour tester si un argument est bien un repertoire,
if [ -d arg ]; then
  echo "C'est une repertoire"
else
  echo "C'est pas un repertoire"
fi;


Pour compter le nombre de fichiers dans un repertoire, un ls |wc -w devrait faire l'affaire.

++
0

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

Posez votre question
Merci beaucoup !
0
asevere Messages postés 13089 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 23 novembre 2024 426
14 mars 2005 à 14:24
ou tout simplement


#!/bin/sh

sed -ie 's/(fic_1 separateur)commentaire/\1nouveau_commentaire/'

Sans passer par un fichier temporaire en prenant soin de verifier que -i a bien le comportement souhaité.
0
Merci beaucoup pour vos réponses, avec tout ça je devrais reussir mon programme !
0
"Pour repondre completement il me faut plusieurs parametres :
1/ ton commentaire doit-il etre juste modifie ou reecrit ? "

Les deux doivent être possibles. Le nom du fichier ne change pas, mais le commentaire doit pouvoir être changé complètement ou juste corrigé.


"2/ la ligne contenant l'information doit-elle etre toujours au meme endroit dans ton fichier?"

Je ne sais pas trop encore, je pense qu'une fois que la ligne sera insérée dans le fichier, elle ne changera plus de place


"3/ ton fichier est-il trier (apr exemple sur le nom des fichiers)? "

Il n'est pas trié, en fait je ne pensais pas que ce serait necessaire, mais je pourais le faire au besoin.

Et si possible, j'aimerais ne pas avoir à créer de fichiers temporaires.



J'aurais une autre question:

Mon fichier texte contient en début de chaque ligne le nom d'un fichier (ou sous-répertoire, je dois pouvoir leur associer un commentaire aussi) contenu dans le répertoire dans lequel il est placé, à partir du moment ou on veut lui attribuer un commentaire.

(imaginons un répertoire A contenant les fichiers 1,2,3 et 4 (peu importe le type de fichier), plus mon fichier texte. Si je veux commenter les fichiers 1, 2 et 3, je créerai une ligne dans mon fichier texte pour chaque fichier, avec son commentaire associé, j'aurai donc 3 lignes commençant par le nom de chaque fichier, et suivies du commentaire qui leur est associé. Je veux ensuite récuperer uniquement le commentaire associé au fichier (cf ma 1ère question)).


Ma nouvelle question est: je crée une nouvelle ligne pour chaque fichier que je veux commenter, jusque là ça va, mais comment faire lorsque je supprime le fichier du répertoire pour que la ligne correspondante soit effacé du fichier texte ?

J'imagine une commande 'ls' qui rechercherait tous les fichiers du repertoire, mais je ne sais pas comment faire pour supprimer une ligne du fichier texte si le fichier correspondant n'existe plus dans le répertoire.
0

Discussions similaires