Pozwól, że wyjaśnię charakter nowego znaku:
$ echo Hello > file1 ; cat file1
Hello
$ echo -n Hello > file2 ; cat file2
Hello$
Tutaj możesz zobaczyć, że file1
na końcu file2
ma znak nowej linii, a nie ma.
Załóżmy teraz, że mam jeden file
:
$ cat file
Hello
Welcome to
Unix
$
I chcę dodać and Linux
na końcu pliku, a następnie echo " and Linux" >> file
zostanie dodany do nowej linii. Ale chcę ostatnią linię jakoUnix and Linux
Aby obejść ten problem, chcę usunąć znak nowej linii na końcu pliku. Dlatego jak usunąć znak nowej linii na końcu pliku?
sed '$s/$/ and linux/'
Odpowiedzi:
Jeśli wszystko, co chcesz zrobić, to dodać tekst do ostatniego wiersza, dzięki sed bardzo łatwo. Zamień
$
(dopasowanie wzorca na końcu linii) tekstem, który chcesz dodać, tylko w liniach z zakresu$
(co oznacza ostatnią linię).które w systemie Linux można skrócić
Jeśli chcesz usunąć ostatni bajt z pliku, Linux (a dokładniej GNU coreutils) oferuje
truncate
polecenie, co czyni to bardzo łatwym.Sposób na POSIX to zrobić
dd
. Najpierw określ długość pliku, a następnie skróć go o jeden bajt mniej.Zauważ, że oba te bezwarunkowo obcinają ostatni bajt pliku. Możesz najpierw sprawdzić, czy jest to nowy wiersz:
źródło
perl -pi -e 'chomp if eof' myfile
. W porównaniu dotruncate
lubdd
nie pozostawi cię z uszkodzonym plikiem, jeśli wmyfile
rzeczywistości nie miałby żadnych nowych linii.Możesz jednak usunąć znak nowej linii z linii poprzez
tr -d '\n'
:Możesz usunąć znak nowej linii na końcu pliku, używając następującego prostego sposobu:
head -c -1 file
Od
man head
:truncate -s -1 file
z
man truncate
:źródło
head -c -1 file | tee file
bezpieczny? Czy nietee
obciąłby pliku przed uruchomieniem?tee
musi tylko otworzyć plik, podczas gdyhead
musi czytać i zapisywać jego zawartość,tee
w praktyce wygra wyścig, z wyjątkiem czasami bardzo małych plików.Możesz to osiągnąć za pomocą Perla jako:
W porównaniu do tego
truncate
lubdd
nie pozostawi ci zepsutego pliku, jeśli wmyfile
rzeczywistości nie miał końcowych znaków nowej linii.(odpowiedź jest zbudowana z komentarza i oparta na tej odpowiedzi )
źródło
Oto jeden sposób
sed
- w ostatnim$
wierszu pliku wyszukaj i zamień wszystko i wszystko (.*
) na „cokolwiek, co pasowałeś”, a następnie „i Linux”:Jeszcze prostsze rozwiązanie, dzięki uprzejmości Izaaka , to:
To zastępuje (symboliczny) koniec wiersza podanym tekstem.
źródło