Pagina 1 di 1

[Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 4:22
da RedSkull92
Sto realizzando una piccola rubrichetta per esercitarmi con il bash, è il mio primo "vero" script, siate clementi :D
Ho realizzato la funzione per cancellare un determinato contatto che è inserito nel file $HOME/contatti.txt
il file è fatto così:
redskull@darkness:~$ cat contatti.txt
simona=0987654321
mimmo=1734421
gaspare=12345
baldassare=54321
melchiorre=67890
djovo=615243
La funzione elimina prima controlla se è presente il nome (prima del segno =)
se non lo trova riporta errore, altrimenti scorre il file e immette in una variabile i vari valori, se trova l'occorrenza salta, alla fine scrive sul file..
Il problema è che alla fine il file sarà scritto così:

redskull@darkness:~$ sh rubrica.sh -d gaspare
gaspare has been deleted successfully
redskull@darkness:~$ cat contatti.txt
simona=0987654321 mimmo=3271734421 baldassare=54321 melchiorre=67890 djovo=615243redskull@darkness:~$
Ho provato tantissimi modi, ma il risultato è quasi sempre questo, io vorrei ricreare il file con le modifiche come prima.
ecco il sorgente delle funzioni che trova l'utente e che elimina, spero sappiate aiutarmi.

Codice: Seleziona tutto

function find_contact ()
{
   if [ ! -e $CONTACT ]; then
      error "The file $CONTACT doesn't exsist."
   fi
   # Prende il nome del contatto 
   FOUND=$(cat $CONTACT | grep "$1=" | sed s/=/\ /g | awk '{print $2}')
   if [ -z $FOUND ]; then
      echo "$1 doesn't found."
   else
      echo "Name: $1"
      echo "Number: $FOUND"
   fi
}

function delete_contact ()
{
   # controlla se è presente il nome
   NAME=$(echo $(find_contact $1 | awk '{print $2}') | awk '{print $1}')
   if [ $NAME != $1 ]; then
      error "$1 doesn't present.\n"
   else
      for j in $(cat $CONTACT); do
         # scorre il file, se non trova l'occorrenza immagazzina la linea in STRINGS
         if [ -z $(echo $j | grep "$1=") ]; then
            STRINGS+="$j\n" 
         fi
      done
       # Cancella gli spazi (mi serve per togliere lo \n finale)
      FILE=$(echo -e $STRINGS | sed /^$/d)
      # Scrive sul file (MA IN MODO SBAGLIATO)
      echo -n $FILE > $CONTACT    
      echo "$1 has been deleted successfully"
   fi
}

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 8:26
da Ansa89
Prova a cambiare

Codice: Seleziona tutto

      # Scrive sul file (MA IN MODO SBAGLIATO)
      echo -n $FILE > $CONTACT
in

Codice: Seleziona tutto

      # Scrive sul file
      echo -ne $FILE > $CONTACT

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 14:16
da RedSkull92
sempre lo stesso risultato
redskull@darkness:~$ cat contatti.txt
simona=0987654321 mimmo=3271734421 baldassare=54321 melchiorre=67890 djovo=615243redskull@darkness:~$
è molto strano, voi conoscete un'altro modo per eliminare dal file il contatto ?

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 14:25
da conraid
Perché riscrivi il file? è una scelta tua o una esigenza didattica?
sed -i "/^$1=/d" $FILE

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 14:49
da RedSkull92
no, mi serviva per cancellare il contatto quindi ho pensato di mettere tutti i contatti dentro una variabile tranne quello da cancellare e dopo sovrascrivere il file.
Penso di aver risolto, ho eliminato

Codice: Seleziona tutto

FILE=$(echo -e $STRINGS | sed /^$/d)
modificando con echo -ne $STRINGS > $CONTACT
Adesso esce perfettamente il file.
C'è un metodo migliore per eliminare una stringa da un file ?
Io avevo pensato con $(cat $CONTACT | sed -e /$1/d) > $CONTACT
che ne dite ?

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 15:22
da sixjan

Codice: Seleziona tutto

grep -v ^$1= $CONTACT > $CONTACT.tmp
mv -f $CONTACT.tmp $CONTACT

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 15:33
da conraid
RedSkull92 ha scritto: C'è un metodo migliore per eliminare una stringa da un file ?
Io avevo pensato con $(cat $CONTACT | sed -e /$1/d) > $CONTACT
che ne dite ?
basta un sed

Re: [Bash] Ricreazione file "sballata"

Inviato: mer 25 ago 2010, 20:45
da RedSkull92
Perfetto grazie.
Il sorgente è questo: http://sprunge.us/OVFI
L'ho fatto solo perché non avevo nulla da fare e volevo imparare il bash.
Nel sorgente mi dite cosa potrei modificare in modo da rendere il sorgente più leggibile/migliore ?
Grazie per gli eventuali suggerimenti.