web-dev-qa-db-fra.com

Est-il possible de lire les caractères en arrière à partir de la fin d'un fichier dans le terminal?

Par exemple, less vous permet de lire ligne par ligne, en commençant par le début. Existe-t-il un utilitaire ou une ligne similaire qui pourrait être exécuté dans le terminal et qui pourrait afficher un fichier en arrière caractère par caractère? Sinon, que diriez-vous d'un utilitaire semblable à "chat" qui affiche l'intégralité du fichier par caractère?

3
user650261

cela le fait:

cat /tmp/aa | tac | rev

où tac inverse ligne par ligne le fichier en gardant les caractères intacts ... puis rev le termine en inversant simplement les caractères de chaque ligne, laissant ligne par ligne intacts .. ainsi, par exemple:

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
6
Scott Stensland

Vous pouvez utiliser seul GNU tac pour lire un fichier caractère par caractère en arrière, en spécifiant un "séparateur d'enregistrement" correspondant à chaque caractère:

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

-s spécifie un séparateur d'enregistrement personnalisé (au lieu de nouvelle ligne) et -r traite la chaîne de séparateur comme une expression régulière.

Ceci diffère des réponses utilisant tac | rev, car il inverse en fait l'ordre des caractères du fichier, y compris les sauts de ligne, et fonctionne correctement même si la dernière ligne ne se termine pas par un retour à la ligne.

% 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
3
Miles

Il existe un utilitaire appelé tac à partir du package GNU coreutils. Il s’agit d’un programme basé sur les lignes, de sorte qu’il imprime chaque ligne sur la sortie standard, dernière ligne en premier - par opposition à chaque caractère.

La commande rev (du package util-linux]) est basée sur des caractères et affiche chaque ligne sur la sortie standard en inversant l'ordre des caractères dans chaque ligne.

1
Anthony Geoghegan

Deux approches différentes utilisant Perl:

1:

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

2:

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

1:

  • -e: exécute l'argument suivant;
  • while($c=getc){$s=$c.$s}: stocke la valeur de retour de getc dans $c et ajoute le préfixe $c à $s jusqu'à ce que la valeur de retour de $c ne soit pas indéfinie;
  • print($s): imprime $s.

2:

  • -F'': désactive le séparateur de champs de saisie (Perl scinde les champs sur n'importe quel caractère);
  • -0777ae: définit le séparateur d'enregistrement d'entrée sur un caractère non valide (cela empêche Perl de scinder les enregistrements), divise les champs de l'entrée qui les stocke dans F et exécute le script transmis en tant qu'argument;
  • print(reverse(@F)): affiche les éléments d'un tableau contenant les éléments de F dans un ordre inversé;
% 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
0
kos