echo "abc" >>file.txt coloca uma nova linha após abc , não antes. Se você acabar com abc em sua própria linha, isso significa que a nova linha antes de abc já estava presente em file.txt .
Observe que é perfeitamente normal que um arquivo de texto termine em uma nova linha. No unix, uma linha consiste em uma sequência de caracteres diferente de null⁰ ou newline seguida por uma nova linha. 1 Portanto, qualquer arquivo de texto não vazio termina com um caractere de nova linha.
Se você quiser adicionar texto à última linha de um arquivo, não poderá fazê-lo com >> , pois isso sempre será anexado ao arquivo, portanto, ele sempre será escrito após a última nova linha. Em vez disso, você precisa de uma ferramenta capaz de modificar um arquivo existente. Por exemplo, você pode usar sed :
sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt
No comando sed, o primeiro $ significa "faça o seguinte comando apenas na última linha", o comando s/REGEX/REPLACEMENT/ substitui REGEX por REPLACEMENT e a expressão regular $ corresponde ao final da linha .
O comando sed do Linux possui um recurso interno para automatizar essa sequência de criação de novos arquivos e substituições, para que você possa encurtá-la para
sed -i '$ s/$/abc/' file.txt
⁰ Isso é um byte nulo, que ASCII chama NUL e Unicode chama U + 0000. Programas de processamento de texto podem ou não lidar com esse caractere.
1 Veja as definições de Arquivo de Texto , Linha e Caractere Newline na seção "Definições" do capítulo Definições de Base do IEEE 1003.1-2008: 2016.