echo "abc" >>file.txtwstawia nowy wiersz po abc , a nie przed. Jeśli skończysz z abcwłasną linią, oznacza to, że nowa linia wcześniej abcbył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.