#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab.txt");  #nom du fichier à lire
my @lignes = <FICHIER>;                                      # met toutes les lignes dans le tableau
close FICHIER;                                            #ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab.txt /root/Desktop/essai_script/fstab.bak`); #fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab.txt");     # crée un nouveau fichier
foreach my $ligne(@lignes) {                                 #pour chaques éléments du tableau
    if ($ligne =~ / /) {                                  #si l'expresion régulière est match avec la ligne alors
    print FIC "............\n";                           #la ligne est modifié par quelquechose ce que tu veux
    }
    elsif ($ligne =~ / /) {                               #une autre expression reguliere
     print FIC "............\n";                          #quelquechose
    }
   else {                                                 # et si aucune des expressions régulières
   print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
   print $ligne;
   }
}
close FIC;
oui on peut modifier juste ce qui correspond par l'expression régulière en rusant un peu faut faire un:
 $lignemodif ="$'"."ce qui va après\n";          # $' correspond a ce qui est avant l'expression régulière
l'expression régulière va entre les / / par exemple
 /dupon[a-z]/
regarde ce cours de perl http://rangiroa.essi.fr/cours/internet/98-perl.pdf
@bioinfomatics :
déjà merci pour ces réponses si rapides, c'est genial.
merci aussi pour cette solution pour le remplacement d'expression, meme s'il faut ruser un peu, mais la je te cache pas que je sais meme pas ou mettre cette commande, et surtout je ne vois pas comment l'exploiter.

il n'est pas simplement possible de remplacer l'expression par une autre ?????

ou comment reussir a décomposer la ligne ou est l'expression pour pouvoir ressortir chaun des ensembles qui la composent dans des variables ???
j'explique avec un exemple :
si on a:
/dev/sda6 /media/donnees ext3 defaults 1 2

alors l'ideal de sortie pour ce que je veux serait ca :
var1=sda6
var2=media/donnees
var3=ext3
var4=defaults

en essayant d'utiliser le caractere "tabulation" ou "espace" ou "/" pour indiquer le changement de variable
pour la ligne:
sda    media    ext     defaut
if ($ligne =~ /([a-zA-Z0-9]+)\t([a-zA-Z0-9]+)\t([a-zA-Z0-9]+)/) {
$sda = $1; #ce que contient la premiere parenthese
$media = $2; #ce que contient la deuxième parenthese
$ext = $3; #ce que contient la troisième parenthese
$defaut = $4; #ce que contient la quatrième parenthese
}
tu peux aussi changer un mot par un autre:
la ligne a changé:
le mot a changé est blabla
if ($ligne =~ /blabla/) {
$nouvelle_ligne = "$'"."toto\n"; #\n pour faire un retour à  la ligne
print nouvelle_ligne; #dans la console apparaîtra le mot a changé est toto
}
bioinfornatics wrote:
if ($lignes =~ /([a-zA-Z0-9]+)\t([a-zA-Z0-9]+)\t([a-zA-Z0-9]+)/) {
$sda = $1; #ce que contient la premiere parenthese
$media = $2; #ce que contient la deuxième parenthese
$ext = $3; #ce que contient la troisième parenthese
$defaut = $4; #ce que contient la quatrième parenthese
}
Attention, pour le deuxième champ, et pour être exaustif, il faudrait tenir compte :
- des noms de répertoires comportant des signes de ponctuation autorisés : underscore, point, etc ;
- des noms de répertoires comportant des lettres accentuées.

ÉDIT : sans oublier les espaces (si si, ça s'est vu, même si c'est plus une habitude Windows) :-o
oui c'est vrai pikachu mais on peut faire comme ça :
if ($lignes =~ /(.+)\t(.+)\t(.+)/) {
$sda = $1; #ce que contient la premiere parenthese
$media = $2; #ce que contient la deuxième parenthese
$ext = $3; #ce que contient la troisième parenthese
$defaut = $4; #ce que contient la quatrième parenthese
}
le . correspont a tous caractere sauf fin de ligne come sa plus de probleme d'accent et de ponctuation sans qu'il se casse trop la tete :hammer:
si tu veux une interface graphique:
#!/usr/bin/perl
# Construction de l'environnement graphique
# Construction de la fenetre
$fenetre1 = MainWindow -> new ();
$fenetre1 -> minsize ( qw(100 100));
$fenetre1 -> title ("FSTAB TOOL);
$fenetre1 -> configure (-background => 'grey');
$fenetre1 ->Button(-text => 'Executer', -relief => 'groove' , -background =>'purple', -activebackground => 'pink', -foreground => 'white', -command => \&script)-> pack ();
sub script {
tu met là le script
}
a ne pas oublier a refermer avec }
Tu as choisi la facilité (le « . ») effectivement :lol: !
Mais si j'étais vicieux (quoique), je dirais --- toujours pour faire dans l'exhaustif --- que les champs de fstab peuvent être simplement séparés par une ou plusieurs espaces, au lieu de tabulations (ça s'est vu aussi) :hammer: Un petit « \s » alors ?
Bon, pas taper...
fibonzou...................

on se détend, j'apprecie énormement votre aide a tous les deux, mais j'arrive pas a suivre tout ce que vous racontez et donnez comme info ou commandes....
en tout cas merci.

Par contre, vu que j'ai commencé mon initiation au script en bash, est-il possible d'y inclure du perl, ou d'appeler un sous-script ecrit en perl ??????

J'ai pas encore essayer la derniere commane, mais je suis surpris que dans l'exemple, aucun chiffre n'apparait, c'est parce que la commande ne marche que pour le texte, ou c'est juste que c'était plus rapide de répondre sans les chiffres ????
c'est juste une question, a laquelle j'aurai la reponse en essayant.......

Merci en tout cas a vous 2
@bioinfomatics :
Je suis toujours sur ton 1er script que j'arrive pas a faire tourner comme je veux, tu peux m'aider ????
pour ca je renvoit le script que j'utilise :

#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab"); #nom du fichier à lire
my @lignes = <FICHIER>; # met toutes les lignes dans le tableau
close FICHIER; #ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab /root/Desktop/essai_script/fstab.bak`);#fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab"); # crée un nouveau fichier
foreach my $ligne(@lignes) { #pour chaques éléments du tableau
if ($ligne =~ /media/) { #si l'expresion régulière est match avec la ligne alors
print FIC "sda1\n"; #la ligne est modifié par quelquechose ce que tu veux
}
elsif ($ligne =~ /media/) { #une autre expression reguliere
print FIC "............\n"; #quelquechose
}
else { # et si aucune des expressions régulières
print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
}
}
close FIC;

voici ensuite le fichier de source :

LABEL=/ / ext3 defaults 1 1
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
LABEL=/home /home ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=SWAP-sda9 swap swap defaults 0 0
/dev/sda1 /media/portFB2-1 ntfs-3g silent,sync,dirsync,users,umask=0002,utf=8 0 0
/dev/sda5 /media/portFB2-2 ntfs-3g silent,sync,dirsync,users,umask=0000,utf=8 1 2
/dev/sda6 /media/donnees ext3 defaults 1 2

et enfin le fichier après l'utilisation du script :

sda1
sda1
sda1


alors que je voudrais juste modifier une ligne si deja présente dans le fichier, sinon l'ecrire telle que définie dans des variables definies avant dans l'execution du script...

Tu vois ou je deconnes dans le script ?????
#!/usr/bin/perl -w
use strict;
open (FICHIER,"< /root/Desktop/essai_script/fstab.txt");  #nom du fichier à lire
my @lignes = <FICHIER>;                                      # met toutes les lignes dans le tableau
close FICHIER;                                            #ferme le fichier original comme ça sa fait un backup
system(`cp /root/Desktop/essai_script/fstab.txt /root/Desktop/essai_script/fstab.bak`); #fichier sauvegardé
open (FIC ,"> /root/Desktop/essai_script/fstab.txt");     # crée un nouveau fichier
foreach my $ligne(@lignes) {                                 #pour chaques éléments du tableau
    if ($ligne =~ / media/) {                                  #si l'expresion régulière est match avec la ligne alors
    print FIC "$'"."sda1"."$`\n";                           #la ligne est modifié par quelquechose ce que tu veux
    }
   else {                                                 # et si aucune des expressions régulières
   print "la ligne:\n$ligne\n\'a pas été modifié\n"; # renvoi dans le terminal :[saut de ligne]la ligne:....[saut de ligne]n'a pas été modifié
   print FIC $ligne;
   }
}
close FIC;
Sinon tu veux a partir de perl tu peux faire des commandes du shell avec la commande system
Apres un week-end loin du PC, je me sens largue dans cette conversation...
Bien vu bioinformatics, le coup pour sauvegarder le fichier ! Belle ruse.

@berok37: l'instruction system en perl s'utilise comme suit:
system('nom_de_la_commande');
De cette maniere, tu executes la commande bash qui est ecrite entre les quotes. La commande peut-etre n'importe quelle commande bash. Attention cependant, ton scipt perl ne recupere pas la sortie de la commande. En gros, a l'appel de cette instruction, ton script est mis en pause, la commande systeme est executee, et apres, ton script repart. Donc par exemple, tu ne pourras pas changer de repertoire par une commande du type system('cd repertoire_a_atteindre');

Que dire d'autre pour commenter le script de bioinformatics... L'instruction use strict; t'oblige a declarer les variables que tu utilises. Et une declaration se fait en utilisant
my $variable_scalaire;
my @liste;
Ce qui nous amene aux deux types de variables utilisees dans ton script. En perl, une variable dont le nom commence par $ est une variable scalaire, et une variable commencant par @ est une liste.
Il est a noter que les elements d'une liste sont des scalaires. Tu accedes donc a un element specifique d'une liste par $liste[numero]. Les differents elements etant numerotes a partir de 0, comme en C.

Voila, je ne sais pas ce que tu as lu ou non sur le perl. Peut-etre que ce que je viens d'ecrire sont des redites.
@+
mais on peut ruser pour récupérer des résulats bash :-D, il suffit de les écrires dans un fichiers (invisible comme sa on le voit pas :hammer:) .stock_resultat puis de lire les lignes du fichier en perl 😉:-P

Sinon pour changer de répertoire tu peux faire la commande chdir qui est l'équivalent de cd 😉
Bien vu encore une fois 😉

Dans mes scripts, je prefere utiliser la commande interne du perl, a savoir chdir, et me passer des commandes shell autant que possible. C'est quand meme plus propre que de passer en permanence d'une commande bash a une commande perl.
oui je fais de même sauf quand une commande bash et plus rapide qu'une ligne perl ex: cp
j'aurais pu faire un:
open(FIC,"<mon_fic.txt");
@FIC = <FIC>;
close FIC;
open(NEWFIC,">nouveau_fic.txt");
print NEWFIC @FIC;
close NEWFIC;
je suis un peu faignant :-D
il y a aussi la possiblite d'utiliser le module copy:
use File::Copy
File::Copy::copy("ancien fichier","nouveau fichier");
Il y a plus d'un chemin qui mene a Rome, c cool ! Et c'est vrai que l'utilisation de la commande bash pour copier n'est pas mal du tout.
oui c'est vrai y a ce module je l'avais oublié :-D. sinon y a aussi le module rename pour renommer les fichier s (ou les dossiers un petit doute!?) mais apparement tu gère tu dois le connaître 😉
C'est une bonne remarque, il doit aussi exister ce module. Il faut que je fasse quelques recherches, mais il me semble qu'il se situe aussi dans le module File::Copy
Et puis je ne gere pas tant que ca, je ne programme en perl que depuis un mois maintenant :hammer:

Apres verification, la commande rename s'utilise directement, sans utiliser de module particulier. Par contre, il semblerait qu'elle aie du mal a fonctionner dans certains cas. Dans ce cas, les commandes copy ou mv du module File::Copy semblent plus sures.
bah tu apprend vite 😉, apres met toi au TK pour faires desinterfaces graphique et des bandes de chargement sa pete:-D
Oui, ca me parait etre une bonne idee, car mes scripts doivent etre utilises par d'autres personnes. Du coup, une interface graphique est beaucoup plus sympa qu'une ligne de commande :-P

edit: j'ai modifie mon message precedent pour ce qui est de la commande rename
si tu as besoin d'aide pour tes scripts je veux bien t'aider 😉