web-dev-qa-db-fra.com

Afficher le contenu du fichier texte de droite à gauche dans le terminal

Existe-t-il un moyen de répertorier le contenu d'un fichier dans une fenêtre Shell, de telle sorte que les caractères soient imprimés de droite à gauche plutôt que comme d'habitude de gauche à droite? ou tel que le algorithme BIDI oriente la direction de la ligne selon le texte présent?

Ceci est pertinent lorsque vous travaillez avec des fichiers texte appartenant à des langages RTL (ainsi que des documents mixtes LTR RTL) dans lesquels vous souhaitez effectuer des recherches importantes et effectuer des recherches approfondies sans charger dans un éditeur ... Les éditeurs n'aiment pas les fichiers volumineux ...

Quelque chose autour de cat pourrait être gentil :)

En fait, j'écrirai peut-être quelque chose qui inversera chaque ligne et conduira à cat si rien de connu n'existe.

5
matt

La commande dont vous avez besoin est rev , par exemple:

$ rev <<<pa4080
0804ap
$ echo -e "pa4080_1\npa4080_2" | rev
1_0804ap
2_0804ap

Bien sûr, cela fonctionne aussi avec les fichiers:

$ >test echo -e "pa4080_1\npa4080_2"
$ <test rev # see annotation below
1_0804ap
2_0804ap

rev filename au lieu de rev <filename est possible mais pas préférable, car explique Stéphane Chazelas .

Dans le cadre de util-linuxrev est installé par défaut sur tous les systèmes Ubuntu.

Ceci et des approches alternatives peuvent être trouvés sur HowTo: Inverser une chaîne sous Unix/Linux Shell? · NixCraft .


Soit dit en passant: rev est à echo comme tac est à cat, afin d'inverser l'ordre des lignes dans un fichier:

$ >test echo -e "pa4080_1\npa4080_2"
$ <test tac
pa4080_2
pa4080_1
$ <test tac | rev
2_0804ap
1_0804ap
7
dessert

la réponse de dessert couvre déjà les utilitaires pouvant être utilisés pour inverser le texte. Si nous voulions utiliser des outils exclusivement Shell, nous pourrions utiliser le développement de paramètres ${variable:start:offset} pour inverser simplement une ligne, puis créer un script qui l'exécutera à chaque ligne du fichier texte.

La ligne peut être inversée comme suit:

#!/bin/bash

length=${#1}
pointer=$((length-1))
while [ $pointer -ge 0  ];
do
    printf "%c" "${1:$pointer:1}"
    pointer=$((pointer-1))
done
printf "\n"

Et ça marche comme ça:

$ ./reverse.sh "hello world"
dlrow olleh

Pour inverser chaque ligne d'un fichier texte, nous pourrions procéder comme suit:

#!/bin/bash
reverse_line(){
    length=${#1}
    pointer=$((length-1))
    while [ $pointer -ge 0  ];
    do
        printf "%c" "${1:$pointer:1}"
        pointer=$((pointer-1))
    done
    printf "\n"
}

while IFS= read -r line || [ -n "$line" ];
do
    reverse_line "$line"
done < "$1"

Tester:

$ printf "hello world\nsecond line" > input.txt
$ ./reverse_file_lines.sh input.txt
dlrow olleh
enil dnoces

Bien sûr, ce n'est pas tout à fait portable puisque ${var:start:offset} est spécifique à bash, nous pourrions donc toujours recourir à awk pour la portabilité:

awk '{for(i=length($0);i>0;i--) printf "%c",substr($0,i,1);print ""}'  input.txt
3

Jetez un coup d’œil à l’outil bicon qui fournit BiDi sur les émulateurs de terminaux.

3
egmont