truncate
truncate -s-1 file
rimuove un (-1) caratteri dalla fine dello stesso file. Esattamente come >>
si aggiungerà allo stesso file.
Il problema con questo approccio è che non mantiene una nuova riga finale se esiste.
La soluzione è:
if [ -n "$(tail -c1 file)" ] # if the file has not a trailing new line.
then
truncate -s-1 file # remove one char as the question request.
else
truncate -s-2 file # remove the last two characters
echo "" >> file # add the trailing new line back
fi
Questo funziona perché coda prende l'ultimo byte (non char).
Non ci vuole quasi tempo nemmeno con i file di grandi dimensioni.
Perché non sed
Il problema con una soluzione sed come sed '$ s/.$//' file
è che legge l'intero file prima (prendendo a lungo con file di grandi dimensioni), allora avete bisogno di un file temporaneo (della stessa dimensione come originale):
sed '$ s/.$//' file > tempfile
rm file; mv tempfile file
E quindi spostare il file temp per sostituire il file.
Cosa avete fatto per risolvere questo? -1 – Jotne
Elencare una manciata di comandi di immondizia e di awk che tolgono l'ultimo carattere da ogni linea non si sentono terribilmente costruttivi. Heh, sapevo che mi sarei fatto male per quello. Tuttavia, non potevo lasciarmi andare nella frase "Ho provato un sacco di sed e awk, ma potevo solo spogliare l'ultimo carattere di ogni riga in una varietà di modi". – MaxPRafferty