在终端中从右到左显示文本文件内容

在终端中从右到左显示文本文件内容

有没有办法在 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


顺便说一句:revecho喜欢taccat,所以要逆转线条顺序在文件中:

$ >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

答案4

该终端mlterm具有从右到左文本的良好功能。您可以通过运行以下命令来安装它:

sudo apt install mlterm

它将自动检测是否以从右到左模式还是从左到右模式显示该行,以及是否将文本向右对齐或向左对齐。

截屏

相关内容