echo "abc" >>file.txt
ставит новую строку после abc
, а не до. Если вы в конечном итоге abc
в своей собственной строке, это означает, что новая строка ранее abc
уже присутствовала в file.txt
.
Обратите внимание, что текстовый файл заканчивается новой строкой. В Unix строка состоит из последовательности символов, отличных от нуля или новой строки, за которой следует новая строка. 1 Поэтому любой непустой текстовый файл заканчивается символом новой строки.
Если вы хотите добавить текст в последнюю строку файла, вы не сможете это сделать >>
, потому что он всегда добавляется в файл, поэтому он всегда пишет после последней новой строки. Вместо этого вам нужен инструмент, способный изменить существующий файл. Например, вы можете использовать sed :
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
В команде sed первая $
означает «выполнить следующую команду только в последней строке», команда s/REGEX/REPLACEMENT/
заменяет REGEX на REPLACEMENT, а регулярное выражение $
совпадает в конце строки.
Linux команда sed имеет встроенную функцию для автоматизации этой последовательности создания нового файла и замены, так что вы можете сократить ее до
sed -i '$ s/$/abc/' file.txt
⁰ Это нулевой байт, который ASCII вызывает NUL, а Unicode - U + 0000. Программы обработки текста могут или не могут справиться с этим символом.
1 См. Определения текстового файла , строки и символа новой строки в разделе «Определения» главы «Основные определения» IEEE 1003.1-2008: 2016.