シェルウィンドウにファイルの内容を一覧表示する方法はありますか。たとえば、通常の左から右ではなく、右から左に文字が印刷されますか?または BIDIアルゴリズム が存在するテキストに従って行の方向を操作するようになっていますか?
これは、エディターにロードせずにgrepと検索を多数行いたいRTL言語(および混合LTR RTLドキュメント)に属するテキストファイルで作業する場合に関連します。エディターは巨大なファイルを好みません...
cat
の周りの何かがいいかもしれません:)
実際、多分私は各行を反転し、何も知られていない場合はcat
にパイプするものを書くでしょう。
必要なコマンドは 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 で見つけることができます。
ちなみに、rev
はecho
がtac
であるようにcat
であるため、ファイル内の行の順序を逆にするには:
$ >test echo -e "pa4080_1\npa4080_2"
$ <test tac
pa4080_2
pa4080_1
$ <test tac | rev
2_0804ap
1_0804ap
デザートの答えはすでに、テキストを反転する目的で使用できるユーティリティをカバーしています。シェルのみのツールを使用する場合は、${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
ターミナルエミュレータでBiDiを提供する bicon ツールをご覧ください。