echo "abc" >>file.txt
coloca uma nova linha depois abc
, não antes. Se você terminar com abc
sua própria linha, isso significa que a nova linha anterior abc
já estava presente 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 que não seja ⁰ ou nova linha seguida por uma nova linha. 1 Portanto, qualquer arquivo de texto não vazio termina com um caractere de nova linha.
Se você deseja adicionar texto à última linha de um arquivo, não pode fazê-lo >>
, porque isso sempre se anexa ao arquivo e, portanto, sempre é gravado 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 "execute o seguinte comando apenas na última linha", o comando s/REGEX/REPLACEMENT/
substitui REGEX por REPLACEMENT, e a expressão regular $
corresponde no final da linha.
O comando sed do Linux possui um recurso interno para automatizar essa sequência de criação de novo arquivo e substituição, para que você possa reduzi-lo para
sed -i '$ s/$/abc/' file.txt
⁰ Esse é um byte nulo, que ASCII chama NUL e Unicode chama U + 0000. Os programas de processamento de texto podem ou não lidar com esse caractere.
1 Consulte as definições de arquivo de texto , linha e caractere de nova linha na seção "Definições" do capítulo Definições de base da IEEE 1003.1-2008: 2016.