Bash - Traitement d'un fichier

Résolu/Fermé
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 - Modifié par Remad le 20/11/2011 à 18:50
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 - 27 nov. 2011 à 23:09
Bonjour à tous!

Voila, je cherche comment remplacer une ligne par un @, puis après supprimer toutes les lignes du fichier qui commencent par un @. En gros, voici le code:

chmod -R 700 $HOME/backup #restore the write permission on the folder  
for ARG in "$@" #for every parameters  
do  
        line=$(awk "NR==$ARG" $HOME/backup/.backup)  
        input=${line%»*} #delete the "»" at the end  
        input=${input#* -> «} #delete the beginning until " -> «"  
        output=${line%» -> *} #delete from "» -> *"  
        output=${output#*«} #delete the "«" at the beginning  
        mv -iv $input $output >> /dev/null #restore the file, no text messages  
        #TODO comment remplacer la ligne par un @?  
done  
#TODO comment supprimer toutes les lignes qui commencent par un @?  
chmod -R 500 $HOME/backup #restore the limited permissions


Merci d'avance!

A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
20 nov. 2011 à 20:46
Salut,

je cherche comment remplacer une ligne par un @, puis après supprimer toutes les lignes du fichier qui commencent par un @
Euh... pourquoi ne pas supprimer la ligne directement ??? ;-\
1
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
20 nov. 2011 à 20:51
Parce que je récupère le numéro de la ligne et la traite une par une. Si je supprime les lignes au même moment, il y a une ligne en moins dans le fichier, donc le paramètre ne référence plus la même ligne.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
20 nov. 2011 à 20:56
Ok.

Donc pour remplacer :

sed -i "s/${line}/@/"  fichier


Pour supprimer :

sed -i '/^@/d' fichier
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
20 nov. 2011 à 21:14
Merci, mais sa marche pas. Pour le remplacement, sa me sort:
sed: -e expression n°1, caractère 11: option inconnue pour 's'
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
20 nov. 2011 à 21:46
Salut,

Pourquoi pas continue avec bash?

#TODO comment remplacer la ligne par un @?

line=${line//*/@}


Si la suppression ne marche pas avec sed alors essaie avec perl
$ cat plop
dsfsdf
@dsfdsjfdlsdfj
dsfjdjsfldsf
@sdfdsfds
dsfdsf
$ perl -pi.orig -e 's/^@.*\n//' plop
$ cat plop
dsfsdf
dsfjdjsfldsf
dsfdsf
$ cat plop.orig
dsfsdf
@dsfdsjfdlsdfj
dsfjdjsfldsf
@sdfdsfds
dsfdsf


0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
20 nov. 2011 à 21:53
#TODO comment remplacer la ligne par un @?
line=${line//*/@}

Je parlais de la ligne qui est dans le fichier $HOME/backup/.backup, pas de la variable $line.

Le programme est pour un DM. Je dois utiliser du bash.
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
Modifié par Remad le 23/11/2011 à 02:13
J'ai trouvé la réponse!

chmod -R 700 $HOME/backup #restore the write permission on the folder     
for ARG in "$@" #for every parameters     
do     
        line=$(awk "NR==$ARG" $HOME/backup/.backup)     
        input=${line%»*} #delete the "»" at the end     
        input=${input#* -> «} #delete the beginning until " -> «"     
        output=${line%» -> *} #delete from "» -> *"     
        output=${output#*«} #delete the "«" at the beginning     
        mv -iv $input $output >> /dev/null #restore the file, no text messages     
        sed -i "s|$line|@|" $HOME/backup/.backupfile #replacing the line with "@"   
done     
sed -i '/^@/d' $HOME/backup/.backupfile #deleting all the "@" lines   
chmod -R 500 $HOME/backup #restore the limited permissions


Maintenant, il faut juste que je vérifie que le(s) paramètres est(sont) valide(s). J'avais pensé à sa:

chmod -R 700 $HOME/backup #restore the write permission on the folder
        nbline=$(wc -l $HOME/backup/.backupfile) #check how many lines there is on the .backupfile file 
        nbline=${nbline% *} #take only the number 
        echo "nbline = $nbline" 
        for ARG in "$@" #for every parameters 
        do 
                if [[ "$ARG" == [0-"$nbligne"] ]] # if the parameter is correct 
                then  
                        line=$(awk "NR==$ARG" $HOME/backup/.backupfile) 
                        input=${line%»*} #delete the "»" at the end 
                        ...


Mais sa ne fonctionne pas... Une idée?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 nov. 2011 à 09:35
for ARG in "$@" #for every parameters
D'où ils sortent tes paramètres ?
Ils ressemblent à quoi ?

Là tu nous donnes un bout de ton script, mais on n'a pas les tenants et les aboutissants, difficile de t'aider sans savoir de quoi il en retourne ;-\
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 nov. 2011 à 10:40
En attendant histoire de faire avancer le schmilblick ;-))

Plutôt que :
        nbline=$(wc -l $HOME/backup/.backupfile) 
        nbline=${nbline% *} #take only the number

Il est plus simple de faire avec une redirection en entrée (<) :
nbline=$(wc -l < $HOME/backup/.backupfile) 
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
23 nov. 2011 à 14:03
Les paramètres sont des nombres qui doivent être compris entre 0 et nbline. Ils ont passés en paramètres quand tu lace le fichier bash, pour savoir quel ligne il du fichier .backupfile tu dois traiter.
0
Remad Messages postés 1662 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 27 juillet 2012 680
23 nov. 2011 à 14:09
Voila le code en entier : http://ww25.codeviewer.org/view/code:2091
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 nov. 2011 à 14:14
Ok. Alors le plus simple c'est encore de comparer la valeur de ton paramètre (est inférieur ou égal) par rapport au nombre maximal de lignes dans ton fichier, comme ça :

$ cat foo.sh 
#! /bin/bash

count=10

for arg in "$@"
do
if [[ $arg -le $count ]]
then echo "Argument $arg correct."
else echo "Argument $arg incorrect."
fi
done

$ ./foo.sh 2 9 11 5 3 15
Argument 2 correct.
Argument 9 correct.
Argument 11 incorrect.
Argument 5 correct.
Argument 3 correct.
Argument 15 incorrect.

$


;-))
0