Есть ли способ перечислить содержимое файла в окне оболочки, чтобы символы печатались справа налево, а не как обычно слева направо? или так, что алгоритм BIDI управляет направлением линии согласно имеющемуся тексту?
Это актуально при работе с текстовыми файлами, относящимися к языкам RTL (а также со смешанными документами LTR RTL), где вы хочу много работать и искать без загрузки в редактор ... редакторам не нравятся огромные файлы ...
Что-то вокруг cat
может быть неплохо:)
На самом деле, возможно, я напишу что-то, что просто перевернет каждую строку и конвейеры к cat
, если ничего не известно.
Взгляните на инструмент bicon , который предоставляет BiDi поверх терминальных эмуляторов.
Вам нужна команда 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
возможно, но не предпочтительно, как Стефан Шазелас объясняет . Sup>
Как часть 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
ответ десерта уже касается утилит, которые могут использоваться в целях инвертирования текста. Если бы мы хотели использовать инструменты только для оболочки, то мы могли бы использовать ${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