Além de usar um arquivo temporário para ajudar, existe uma maneira / programa de armazenar em buffer a entrada, stdin
mas não produz o conteúdo até obter o arquivo EOF
. Também não quero usar uma variável de shell (por exemplo buffer=$(cat)
).
Este programa deve se comportar da seguinte forma (suponha que o nome do programa seja buffered-cat
):
$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Agora que o programa recebeu ^D
, o buffered-cat
resultado é gerado
line 1
line 2
line 3
sort
para esse fim. Obviamente, tem efeitos colaterais que podem ser indesejáveis.Respostas:
Um homem pobre
sponge
usandoawk
:Se você tiver
tac
, também poderá usá-lo incorretamente:fonte
tac
é simples e elegante, eu acho.| tac | tac
é simples, mas lembre-se de que é altamente ineficiente para a tarefa e você sofrerá um impacto no desempenho, especialmente em arquivos maiores.Você pode fazer isso com o
sponge
moreutils .sponge
"absorverá a entrada padrão e gravará em um arquivo". Sem argumentos, esse arquivo é uma saída padrão. A entrada fornecida para este comando é armazenada na memória até EOF e, em seguida, gravada de uma só vez.Para gravar em um arquivo normal, você pode apenas dar o nome do arquivo:
O principal objetivo de
sponge
é permitir a leitura e gravação do mesmo arquivo em um pipeline, mas ele também faz o que você deseja.fonte
Desde que sua entrada seja texto ASCII (não contém NUL 0x0 bytes até o final),
sed -z
faça o que deseja:As
-z
causassed
para tratar o byte NUL como um delimitador de linha em vez da nova linha usual. Portanto, desde que sua entrada seja texto normal sem bytes NUL, o sed continuará lendo toda a entrada em seu buffer de padrão até que o EOF seja alcançado.sed
então não processa o buffer e o produz.Se houver NUL bytes em sua entrada, você poderá fazer isso:
fonte
Essa
sed
solução é um pouco mais longa que a do DigitalTrauma, mas também funciona com bytes NUL.fonte
sed ':l;N;bl'
deve funcionar também.O comportamento que você está pedindo, não é o comportamento padrão do gato simples?
fonte
cat
(Enter)Line 1
(Enter) e veja o que acontece.Mesma idéia do exemplo awk de muru, exceto em Python. Use CtrlDpara parar de ler nas linhas
fonte
perl -e 'print <>'
(!)