Outro perl:
perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/$ echo ABBBAAAABBBBBABBABBBABBB | \
perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/#!/usr/bin/env perl
binmode \*STDIN;
while ( defined ( $_ = getc ) ) {
$_ = unpack "B*";
tr/01/AB/;
print;
print "\n" if ( not ++$cnt % 3 );
}
print "\n" if ( $cnt % 3 );
/; $_ = pack "B*", $_' | \
od -tx1
0000000 70 fb 77
0000003
/; $_ = pack "B*", $_'
Prova:
perl -pe 'BEGIN { $/ = ; $\ = "\n"; binmode \*STDIN } $_ = unpack "B*"; tr/01/AB/'
A leitura acima lê uma linha por vez. Cabe a você garantir que as linhas sejam exatamente o que deveriam ser.
Editar: a operação inversa:
perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/$ echo ABBBAAAABBBBBABBABBBABBB | \
perl -pe 'BEGIN { binmode \*STDOUT } chomp; tr/AB/#!/usr/bin/env perl
binmode \*STDIN;
while ( defined ( $_ = getc ) ) {
$_ = unpack "B*";
tr/01/AB/;
print;
print "\n" if ( not ++$cnt % 3 );
}
print "\n" if ( $cnt % 3 );
/; $_ = pack "B*", $_' | \
od -tx1
0000000 70 fb 77
0000003
/; $_ = pack "B*", $_'
Isto lê um byte de entrada de cada vez.
Editar 2: Operação reversa mais simples:
perl -pe 'BEGIN { $/ = ; $\ = "\n"; binmode \*STDIN } $_ = unpack "B*"; tr/01/AB/'
O texto acima lê 3 bytes por vez a partir de STDIN
(mas receber EOF
no meio de uma sequência não é um problema fatal).