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.
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-linux
rev
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
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
Jetez un coup d’œil à l’outil bicon qui fournit BiDi sur les émulateurs de terminaux.