有没有办法在 shell 窗口中列出文件内容,以便从右到左打印字符,而不是像往常一样从左到右打印?或者BIDI 算法根据当前文本控制线路方向?
当处理属于 RTL 语言(以及混合 LTR RTL 文档)的文本文件时,这很重要,因为您想要进行大量 grep 和搜索而不加载到编辑器中...编辑器不喜欢大文件...
周围有些东西cat
可能会很好:)
事实上,cat
如果没有任何已知信息存在,我可能会写一些东西来反转每一行并通过管道传输。
答案1
您需要的命令是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éphane Chazelas 解释道。
作为其中的一部分,util-linux
rev
它默认安装在每个 Ubuntu 系统上。
这种方法和其他方法可以在如何:在 Unix / Linux Shell 中反转字符串?· 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
答案2
dessert 的答案已经涵盖了可用于反转文本的实用程序。如果我们想使用仅限 shell 的工具,我们可以${variable:start:offset}
先利用参数扩展来反转一行,然后编写一个脚本对文本文件中的每一行执行该操作。
线路可以像这样反转:
#!/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 的工具。
更新:
GNOME Terminal 3.34(实际上是 VTE 0.58,以及所有基于 VTE 的模拟器)支持 BiDi,并在需要时自动将顺序“翻转”为 RTL。
还有一些其他模拟器也这样做,例如 Konsole 和 Mlterm。
其余部分您仍然可以使用bicon
。