Отображение содержимого текстового файла справа налево в терминале

Есть ли способ перечислить содержимое файла в окне оболочки, чтобы символы печатались справа налево, а не как обычно слева направо? или так, что алгоритм BIDI управляет направлением линии согласно имеющемуся тексту?

Это актуально при работе с текстовыми файлами, относящимися к языкам RTL (а также со смешанными документами LTR RTL), где вы хочу много работать и искать без загрузки в редактор ... редакторам не нравятся огромные файлы ...

Что-то вокруг cat может быть неплохо:)

На самом деле, возможно, я напишу что-то, что просто перевернет каждую строку и конвейеры к cat, если ничего не известно.

6
задан 6 December 2017 в 04:24

3 ответа

Взгляните на инструмент bicon , который предоставляет BiDi поверх терминальных эмуляторов.

3
ответ дан 6 December 2017 в 04:24

Вам нужна команда 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 возможно, но не предпочтительно, как Стефан Шазелас объясняет .

Как часть util-linux rev устанавливается в каждой системе Ubuntu по умолчанию.

Этот и альтернативные подходы можно найти в . Как: поменять строку в оболочке 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
7
ответ дан 6 December 2017 в 04:24

ответ десерта уже касается утилит, которые могут использоваться в целях инвертирования текста. Если бы мы хотели использовать инструменты только для оболочки, то мы могли бы использовать ${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} является определенным для удара, таким образом, мы могли всегда обращаться к awk для мобильности:

awk '{for(i=length($0);i>0;i--) printf "%c",substr($0,i,1);print ""}'  input.txt
3
ответ дан 6 December 2017 в 04:24

Другие вопросы по тегам:

Похожие вопросы: