[Bash] Ricreazione file "sballata"

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

[Bash] Ricreazione file "sballata"

Messaggio 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
}

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: [Bash] Ricreazione file "sballata"

Messaggio 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

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: [Bash] Ricreazione file "sballata"

Messaggio 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 ?

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Bash] Ricreazione file "sballata"

Messaggio da conraid »

Perché riscrivi il file? è una scelta tua o una esigenza didattica?
sed -i "/^$1=/d" $FILE

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: [Bash] Ricreazione file "sballata"

Messaggio 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 ?

sixjan
Linux 2.x
Linux 2.x
Messaggi: 413
Iscritto il: dom 6 gen 2008, 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: [Bash] Ricreazione file "sballata"

Messaggio da sixjan »

Codice: Seleziona tutto

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

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: [Bash] Ricreazione file "sballata"

Messaggio 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

Avatar utente
RedSkull92
Linux 3.x
Linux 3.x
Messaggi: 567
Iscritto il: mar 21 apr 2009, 17:25
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox
Località: Palermo
Contatta:

Re: [Bash] Ricreazione file "sballata"

Messaggio 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.

Rispondi