Existe uma maneira de ler caracteres para trás a partir do final de um arquivo no terminal?

3

Por exemplo, menos permite ler linha por linha, começando do começo. Existe um utilitário ou linha semelhante que pode ser executado no terminal que pode exibir um caractere de retrocesso de arquivo por caractere? Se não, que tal um utilitário "cat" que exibe o arquivo inteiro para trás por caractere?

    
por user650261 30.10.2015 / 00:31

4 respostas

6

isso faz:

cat /tmp/aa | tac | rev

onde tac inverte o arquivo linha por linha, mantendo os caracteres intactos ... então, rev termina-o simplesmente invertendo os caracteres de cada linha, deixando linha por linha intacta .. assim, por exemplo:

cat /tmp/aa 


Is there a way to read characters backwards from the end of a file in the terminal?

For instance, less allows you to read line by line, starting from the beginning. Is there a similar utility or line that could be run in the terminal that could display a file backward character by character?



cat /tmp/aa | tac | rev


retcarahc yb retcarahc drawkcab elif a yalpsid dluoc taht lanimret eht ni nur eb dluoc taht enil ro ytilitu ralimis a ereht sI .gninnigeb eht morf gnitrats ,enil yb enil daer ot uoy swolla ssel ,ecnatsni roF

lanimret eht ni elif a fo dne eht morf sdrawkcab sretcarahc daer ot yaw a ereht sI
    
por Scott Stensland 30.10.2015 / 00:43
3

Você pode usar o GNU tac sozinho para ler um arquivo invertido caractere por caractere, especificando um "separador de registro" que corresponda a cada caractere:

# Reverse a file character by character.
# From http://www.gnu.org/software/coreutils/tac
tac -r -s 'x\|[^x]' input_file

-s especifica um separador de registro personalizado (em vez de nova linha) e -r trata a string separadora como uma expressão regular.

Isso é diferente das respostas usando tac | rev , porque na verdade inverte a ordem dos caracteres no arquivo, incluindo novas linhas, e funciona corretamente mesmo se a última linha não terminar em uma nova linha.

% printf 'Hello\nworld\n' | tac | rev | xxd
0000000: 646c 726f 770a 6f6c 6c65 480a            dlrow.olleH.

% printf 'Hello\nworld\n' | tac -r -s 'x\|[^x]' | xxd
0000000: 0a64 6c72 6f77 0a6f 6c6c 6548            .dlrow.olleH
    
por Miles 30.10.2015 / 08:27
1

Existe um utilitário chamado tac do pacote GNU coreutils . Está um programa baseado em linha para que imprima cada linha na saída padrão, a última linha primeiro - ao contrário de cada caractere.

O comando rev (do pacote util-linux ) é baseado em caracteres e imprime cada linha na saída padrão, revertendo a ordem dos caracteres em todas as linhas.

    
por Anthony Geoghegan 30.10.2015 / 00:36
0

Duas abordagens diferentes usando o Perl:

1:

perl -e 'while($c=getc){$s=$c.$s};print($s)' <input

2:

perl -F'' -0777ae 'print(reverse(@F))' <input

1:

  • -e : executa o seguinte argumento;
  • while($c=getc){$s=$c.$s} : armazena o valor de retorno de getc em $c e pré-acrescenta $c a $s até que o valor de retorno de $c não seja indefinido;
  • print($s) : imprime $s .

2:

  • -F'' : anula o separador do campo de entrada (isto faz com que os campos divididos Perl em qualquer caractere);
  • -0777ae : configura o separador de registro de entrada para um caractere inválido (isso evita que o Perl divida registros), divide os campos da entrada armazenando-os em F e executa o script passado como argumento;
  • print(reverse(@F)) : imprime os elementos de uma matriz contendo os elementos de F em uma ordem inversa;
% cat input
For instance, less allows you to read line by line, starting from the beginning.
Is there a similar utility or line that could be run in the terminal that could display a file backward character by character?
If not, how about a "cat" like utility that displays the entire file backward by character?
% perl -e 'while($c=getc){$s=$c.$s};print($s)' <input

?retcarahc yb drawkcab elif eritne eht syalpsid taht ytilitu ekil "tac" a tuoba woh ,ton fI
?retcarahc yb retcarahc drawkcab elif a yalpsid dluoc taht lanimret eht ni nur eb dluoc taht enil ro ytilitu ralimis a ereht sI
.gninnigeb eht morf gnitrats ,enil yb enil daer ot uoy swolla ssel ,ecnatsni roF
% perl -F'' -0777ae 'print(reverse(@F))' <input

?retcarahc yb drawkcab elif eritne eht syalpsid taht ytilitu ekil "tac" a tuoba woh ,ton fI
?retcarahc yb retcarahc drawkcab elif a yalpsid dluoc taht lanimret eht ni nur eb dluoc taht enil ro ytilitu ralimis a ereht sI
.gninnigeb eht morf gnitrats ,enil yb enil daer ot uoy swolla ssel ,ecnatsni roF
    
por kos 30.10.2015 / 05:12