echo "abc" >>file.txt
wstawia nowy wiersz po abc
, a nie przed. Jeśli skończysz z abc
własną linią, oznacza to, że nowa linia wcześniej abc
była już w file.txt
.
Zauważ, że całkowicie normalne jest, aby plik tekstowy kończył się nową linią. W systemie uniksowym linia składa się z sekwencji znaków innych niż null⁰ lub nowa linia, po której następuje nowa linia. 1 Dlatego każdy niepusty plik tekstowy kończy się znakiem nowej linii.
Jeśli chcesz dodać tekst do ostatniego wiersza pliku, nie możesz tego zrobić >>
, ponieważ to zawsze dołącza się do pliku, więc zawsze pisze po ostatniej nowej linii. Zamiast tego potrzebujesz narzędzia, które może modyfikować istniejący plik. Na przykład możesz użyć sed :
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
W poleceniu sed pierwsze $
oznacza „wykonaj następujące polecenie tylko w ostatnim wierszu”, polecenie s/REGEX/REPLACEMENT/
zastępuje REGEX przez WYMIANA, a wyrażenie regularne $
pasuje na końcu wiersza.
Polecenie sed systemu Linux ma wbudowaną funkcję automatyzującą tę sekwencję tworzenia-nowego-pliku-i-zamiany, dzięki czemu można ją skrócić
sed -i '$ s/$/abc/' file.txt
⁰ To bajt zerowy, który ASCII nazywa NUL, a Unicode nazywa U + 0000. Programy przetwarzające tekst mogą, ale nie muszą, radzić sobie z tym znakiem.
1 Patrz definicje pliku tekstowego , wiersza i znaku nowej linii w sekcji „Definicje” rozdziału Definicje podstawowe w IEEE 1003.1-2008: 2016.