echo "abc" >>file.txt
ставить новий рядок після abc
, не раніше. Якщо ви закінчилися з abc
його власним рядком, це означає, що новий рядок раніше abc
вже був у file.txt
.
Зауважте, що цілком нормально, щоб текстовий файл закінчувався в новому рядку. У unix рядок складається з послідовності символів, відмінних від null⁰ або newline, за якими слідує новий рядок. 1 Отже, будь-який не порожній текстовий файл закінчується символом нового рядка.
Якщо ви хочете додати текст до останнього рядка файла, ви не можете це зробити >>
, оскільки це завжди додається до файлу, тому він завжди записується після останнього нового рядка. Натомість вам потрібен інструмент, який здатний змінювати існуючий файл. Наприклад, ви можете використовувати sed :
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
У команді sed перший $
означає "виконати наступну команду лише в останньому рядку", команда s/REGEX/REPLACEMENT/
замінює REGEX на ЗАМОВЛЕННЯ, а регулярний вираз $
відповідає в кінці рядка.
Команда sed Linux має вбудовану функцію для автоматизації цієї послідовності створення нового файлу та заміни, тож ви можете скоротити її до
sed -i '$ s/$/abc/' file.txt
⁰ Це нульовий байт, який ASCII називає NUL, а Unicode викликає U + 0000. Програми обробки тексту можуть або не можуть впоратися з цим символом.
1 Див. Визначення символів текстового файлу , рядка та нового рядка в розділі "Визначення" розділу " Основні визначення " IEEE 1003.1-2008: 2016.