truncate
truncate -s-1 file
usuwa jeden znak (-1) z końcem tego pliku. Dokładnie jako >>
zostanie dołączony do tego samego pliku.
Problem z tym podejściem polega na tym, że nie zachowuje on wstecznego znaku nowego wiersza, jeśli istnieje.
Roztwór:
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
ten działa, ponieważ ogon wykonuje ostatni bajt (nie znaków).
Prawie bez czasu nie zajmuje nawet dużych plików.
Dlaczego nie sed
Problem z sed rozwiązania jak sed '$ s/.$//' file
jest to, że czyta cały plik pierwszy (biorąc długo z dużych plików), to trzeba plik tymczasowy (o takim samym rozmiarze jako oryginał):
sed '$ s/.$//' file > tempfile
rm file; mv tempfile file
Następnie przenieś plik temp, aby zastąpić plik.
Co zrobiłeś, aby rozwiązać ten problem? -1 – Jotne
Wymienienie garści śmieci i poleceń awk, które usuwają ostatnią postać z każdej linii, nie wydawały się strasznie konstruktywne. Heh, wiedziałem, że dostanę za to dinged. Mimo to nie mogłem zmusić się do odejścia w zdaniu "Próbowałem gromady sed i awk, ale mogłem jedynie rozebrać ostatni znak linii na różne sposoby". – MaxPRafferty