Repository 32bit  Forum
Repository 64bit  Wiki

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

[Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 3:22

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
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 553
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda Ansa89 » mer ago 25, 2010 7:26

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
Ansa89
Iper Master
Iper Master
 
Messaggi: 2621
Iscritto il: mer ago 29, 2007 16:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.16.1-ck1
Desktop: XFCE 4.6.1

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 13:16

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
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 553
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda conraid » mer ago 25, 2010 13:25

Perché riscrivi il file? è una scelta tua o una esigenza didattica?
sed -i "/^$1=/d" $FILE
Avatar utente
conraid
Staff
Staff
 
Messaggi: 11994
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 13:49

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 ?
Avatar utente
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 553
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda sixjan » mer ago 25, 2010 14:22

Codice: Seleziona tutto
grep -v ^$1= $CONTACT > $CONTACT.tmp
mv -f $CONTACT.tmp $CONTACT
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 407
Iscritto il: dom gen 06, 2008 11:46
Slackware: 14.1
Kernel: 3.10.17-smp
Desktop: Xfce 4.10

Re: [Bash] Ricreazione file "sballata"

Messaggioda conraid » mer ago 25, 2010 14:33

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
conraid
Staff
Staff
 
Messaggi: 11994
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 19:45

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.
Avatar utente
RedSkull92
Linux 2.6
Linux 2.6
 
Messaggi: 553
Iscritto il: mar apr 21, 2009 16:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 2 ospiti

cron