Acrescentando uma linha a um arquivo no comando cat?

8

Eu posso fazer cat file.txt para obter o conteúdo de um arquivo, mas também quero adicionar uma linha final de minha escolha.

Eu tentei canalizar o (cat file.txt ; echo "My final line") | , mas apenas a linha final está sendo passada pelo cano. Como posso me juntar ao gato e à linha final?

Edite para um ponto de esclarecimento: não desejo modificar o arquivo em si. Estou ciente de que, se esse fosse o caso, eu poderia fazer echo "My final line" >> file.txt ou echo "My final line" | tee -a file.txt , mas estou apenas tentando fazer o acréscimo no contexto desse comando específico, para que eu possa canalizar a concatenação de file.txt e "My final line" .

    
por DoubleBass 24.10.2017 / 16:04

4 respostas

23

Você pode aproveitar a capacidade de cat de ler de stdin combinada com sua capacidade de ler vários arquivos para conseguir isso.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Você também pode adicionar uma linha como tal:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Observe que você não está limitado a uma única linha. cat lerá stdin até atingir EOF. Você pode passar a saída de curl , por exemplo, para preceder ou anexar à saída de cat .

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>
    
por Mathieu Mitchell 24.10.2017 / 18:24
11
sed -e '$aMy final line' file.txt

De man sed a opção -e

-e script, --expression=script
    add the script to the commands to be executed

$ corresponde à última linha e a acrescenta a sequência.

Se você quiser anexar permanentemente a linha ao arquivo, use -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Alterando o comando para

sed -i -e '$aMy final line' file.txt
    
por Katu 24.10.2017 / 16:10
8

Para anexar uma linha a um arquivo, basta usar o operador de redirecionamento de anexação de shell, >> (o arquivo será open(2) -ed com O_APPEND flag):

echo 'My final line' >>file.txt

Agora, se você quiser apenas visualizar o conteúdo do arquivo com uma linha final anexada, eu usaria cat com dois argumentos:

  • Primeiro, seu arquivo obviamente, digamos file.txt
  • O segundo argumento seria a string de sua escolha e, para passar a string como um nome de arquivo (como cat lida apenas com arquivos), você pode alavancar a substituição do processo, <() , que retornaria um descritor de arquivo ( /proc/self/fd/<fd_number>) .

Colocando estes juntos:

cat file.txt <(echo 'My final line')

Se você deseja que a saída seja paginada, supondo que less seja seu pager favorito:

less file.txt <(echo 'My final line')
    
por heemayl 24.10.2017 / 16:14
5

Já foi esclarecido nos comentários à questão, mas adicionando novamente como resposta aqui.

O comando anotado na pergunta

(cat file.txt ; echo "My final line") | other command

funciona como esperado - toda a saída do subshell formado pelos parênteses é canalizada para o segundo comando.

Se o arquivo não terminar com uma nova linha, a string ecoada será anexada à última linha - isso é comum com todas as outras soluções aqui e pode ser resolvido adicionando outro eco (vazio) antes.

    
por Paŭlo Ebermann 24.10.2017 / 23:07