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.