Repository 32bit  Forum
Repository 64bit  Wiki

[Bash] Ricreazione file "sballata"

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola 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 4: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: 539
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda Ansa89 » mer ago 25, 2010 8: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: 2571
Iscritto il: mer ago 29, 2007 17:57
Località: Modena
Nome Cognome: Stefano Ansaloni
Slackware: 13.1
Kernel: 3.9.3-ck1
Desktop: XFCE 4.6.1

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 14: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: 539
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda conraid » mer ago 25, 2010 14:25

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

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 14: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: 539
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox

Re: [Bash] Ricreazione file "sballata"

Messaggioda sixjan » mer ago 25, 2010 15:22

Codice: Seleziona tutto
grep -v ^$1= $CONTACT > $CONTACT.tmp
mv -f $CONTACT.tmp $CONTACT
sixjan
Linux 2.4
Linux 2.4
 
Messaggi: 383
Iscritto il: dom gen 06, 2008 12:46
Slackware: 12.2
Kernel: 2.6.27.31
Desktop: KDE 3.5.10

Re: [Bash] Ricreazione file "sballata"

Messaggioda conraid » mer ago 25, 2010 15: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: 11896
Iscritto il: gio lug 14, 2005 0:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [Bash] Ricreazione file "sballata"

Messaggioda RedSkull92 » mer ago 25, 2010 20: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: 539
Iscritto il: mar apr 21, 2009 17:25
Località: Palermo
Slackware: 64bit -current
Kernel: 3.5.4
Desktop: FluxBox


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite