Bash - Traitement d'un fichier

Résolu
Remad Messages postés 1662 Date d'inscription   Statut Membre Dernière intervention   -  
Remad Messages postés 1662 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Contributeur Dernière intervention   6 430
 
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   Statut Membre Dernière intervention   711
 
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   Statut Contributeur Dernière intervention   6 430
 
Ok.

Donc pour remplacer :

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


Pour supprimer :

sed -i '/^@/d' fichier
0
Remad Messages postés 1662 Date d'inscription   Statut Membre Dernière intervention   711
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Membre Dernière intervention   711
 
#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   Statut Membre Dernière intervention   711
 
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   Statut Contributeur Dernière intervention   6 430
 
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   Statut Contributeur Dernière intervention   6 430
 
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   Statut Membre Dernière intervention   711
 
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   Statut Membre Dernière intervention   711
 
Voila le code en entier : http://ww25.codeviewer.org/view/code:2091
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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