web-dev-qa-db-ja.com

ターミナルでテキストファイルのコンテンツを右から左に表示する

シェルウィンドウにファイルの内容を一覧表示する方法はありますか。たとえば、通常の左から右ではなく、右から左に文字が印刷されますか?または BIDIアルゴリズム が存在するテキストに従って行の方向を操作するようになっていますか?

これは、エディターにロードせずにgrepと検索を多数行いたいRTL言語(および混合LTR RTLドキュメント)に属するテキストファイルで作業する場合に関連します。エディターは巨大なファイルを好みません...

catの周りの何かがいいかもしれません:)

実際、多分私は各行を反転し、何も知られていない場合はcatにパイプするものを書くでしょう。

5
matt

必要なコマンドは rev です。例:

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

もちろん、これはファイルでも機能します:

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

rev filenameの代わりにrev <filenameを使用できますが、 StéphaneChazelasが説明します のように好ましくありません。

util-linuxの一部として、revはデフォルトですべてのUbuntuシステムにインストールされます。

このアプローチと代替アプローチは HowTo:Unix/Linuxシェルで文字列を逆にしますか?・nixCraft で見つけることができます。


ちなみに、revechotacであるようにcatであるため、ファイル内の行の順序を逆にするには

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

デザートの答えはすでに、テキストを反転する目的で使用できるユーティリティをカバーしています。シェルのみのツールを使用する場合は、${variable:start:offset}パラメーター展開を使用して、最初に1行だけを反転し、次にテキストファイルの各行でそれを実行するスクリプトを作成できます。

行は次のように反転できます。

#!/bin/bash

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

そして、それは次のように機能します:

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

テキストファイルの各行を反転するには、次のようにします。

#!/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"

テスト:

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

もちろん、これは${var:start:offset}がbash固有であるため移植性があまり高くないため、移植性のために常にawkに頼ることができます。

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

ターミナルエミュレータでBiDiを提供する bicon ツールをご覧ください。

3
egmont