Semelhante à resposta de Jasen, esta é uma base para um utilitário.
O código esponja no pacote moreutils foi projetado para permitir uma capacidade in-loco para quase qualquer programa, embora externamente. Essencialmente, ele absorve a entrada de STDIN e, em seguida, grava a saída coletada em um nome de arquivo, mas NÃO com a reorientação.
Gostamos da ideia, por isso criamos uma obra semelhante que coleta dados na memória, em oposição a um arquivo como a esponja real.
Aqui está um trecho de script de shell para ilustrar isso:
# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input files data2, data3:"
head data[23]
pe
ls -gGli data[23]
pl " Results, re-write file from memory, preserving inode:"
cat data[23] | ./absorb-memory-public data3
head -v data3
pe
ls -gGli data3
Produção:
-----
Input files data2, data3:
==> data2 <==
hello world
hello bangladesh
==> data3 <==
Dhaka in Bangladesh
Dhaka is capital of Bangladesh
1051395 -rw-r--r-- 1 30 Jan 7 08:58 data2
1052221 -rw-r--r-- 1 53 Jan 7 08:58 data3
-----
Results, re-write file from memory, preserving inode:
==> data3 <==
hello world
hello bangladesh
Dhaka in Bangladesh
Dhaka is capital of Bangladesh
1052221 -rw-r--r-- 1 83 Jan 7 08:58 data3
O núcleo do código perl é bastante curto (especialmente sem verificação de erros, cuja adição pode ser desejável):
use warnings;
use strict;
use Carp;
# Avoid hang for argument matching "-version","--version", etc.
exit(0) if @ARGV && $ARGV[0] =~ /-version/;
my ( $file, $f, $memory );
$file = shift || croak("Need a filename.");
$/ = 0777; # Slurp the entire STDIN
$memory = do { local $/; <> };
open( $f, ">", $file ) || die " Cannot open file \"$file\" for write.\n";
print $f "$memory";
Executar em um sistema como:
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
bash GNU bash 4.3.30
perl 5.20.2
Felicidades ... felicidades, drl