acrescenta texto com eco sem nova linha

8

Eu quero acrescentar texto ao arquivo como echo "abc" >>file.txt .

Mas isso adiciona abc após nova linha

Como posso adicionar abc no final do arquivo com echo sem nova linha?

    
por choijj 24.12.2017 / 18:16

6 respostas

15

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.

    
por 24.12.2017 / 18:36
10

Não acredito que seja possível com o comando echo , em vez disso, use a seguinte abordagem sed :

sed -i '$ s/$/abc/' file.txt
  • -i - modifica o arquivo inplace
  • $ - indica o último registro / linha
  • s/$/abc/ - substitui o final da linha $ pela substring abc (para o último registro)
por 24.12.2017 / 18:23
9

Se você tiver o comando truncate e seu arquivo de texto tiver NL como seu último caractere, você poderá removê-lo e, em seguida, anexar seu texto da seguinte forma:

truncate --size -1 file.txt
echo "abc" >>file.txt

(Observe que truncate não se importa com o conteúdo do arquivo e, neste exemplo, reduz o tamanho do arquivo em um byte. Se o último caractere não for um único byte, ou seja, um caractere "amplo" de vários bytes, você irá introduzir a corrupção.)

    
por 24.12.2017 / 21:49
5

Supondo que o arquivo ainda não termine em uma nova linha e você simplesmente queira adicionar mais texto sem adicionar um, use o argumento -n , por exemplo,

echo -n "some text here" >> file.txt

No entanto, alguns sistemas UNIX não fornecem essa opção; Se esse for o caso, você pode usar printf , por exemplo,

printf %s "some text here" >> file.txt

(sendo o argumento inicial %s para proteger contra o texto adicional com % caracteres de formatação)

De man echo (no macOS High Sierra):

-n

Do not print the trailing newline character. This may also be achieved by appending '\c' to the end of the string, as is done by iBCS2 compatible systems. Note that this option as well as the effect of '\c' are implementation-defined in IEEE Std 1003.1-2001 ("POSIX.1") as amended by Cor. 1-2002. Applications aiming for maximum portability are strongly encouraged to use printf(1) to suppress the newline character.

    
por 24.12.2017 / 22:29
5

O que você quer é adicioná-lo no final da última linha, logo antes do delimitador da última linha, logo antes do último caractere do arquivo.

Com ksh93 , você pode fazer:

echo abc 1<> file >#((EOF - 1))

Em que 1<> é o operador padrão para abrir um arquivo no modo de leitura + gravação (e mais importante sem truncamento ) no stdout e >#((...)) é um específico do ksh93 procurando operador (aqui procurar antes do último byte). Observe que echo escreve abc<newline> , em que a sobrescreve a nova linha que estava lá e echo adiciona sua própria nova linha.

O zsh equivalente:

zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file

No entanto, para um equivalente mais exato, você também precisará imprimir uma mensagem de erro após não procurar:

zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file
    
por 24.12.2017 / 23:02
-1

Provavelmente um UUOC , mas você também pode fazer:

echo "$(cat file.txt)abc" >file.txt

Como Gilles aponta, este comando é limitado:

This mostly works, but not if there is sometimes a blank line at the end of the file and a blank line immediately before. E.g. a file with a fixed number of lines, where the last line is initially empty and is extended over time, and the next-to-last-line may sometimes be empty.

Além disso, tenha cuidado ao usar cat em arquivos com os quais você não está familiarizado:

Conclusão :

Use sed

    
por 24.12.2017 / 18:40