Есть ли способ читать символы назад с конца файла в терминале?

Например, меньше позволяет вам читать строки за строкой, начиная с самого начала. Есть ли аналогичная утилита или строка, которая может быть запущена в терминале, который может отображать обратный символ по символу? Если нет, как насчет утилиты «cat», которая отображает весь файл назад символом?

1
задан 30 October 2015 в 03:31

3 ответа

Вы можете использовать только GNU tac для чтения файла по-символьному символу, указав «разделитель записи», который соответствует каждому символу:

# Reverse a file character by character.
# From http://www.gnu.org/software/coreutils/tac
tac -r -s 'x\|[^x]' input_file

-s указывает пользовательский разделитель записи (вместо новой строки) и -r обрабатывает строку разделителя как регулярное выражение.

Это отличается от ответов с помощью tac | rev, поскольку фактически отменяет порядок символов в файле, включая новые строки, и работает корректно, даже если последняя строка не заканчивается в новой строке.

% printf 'Hello\nworld\n' | tac | rev | xxd
0000000: 646c 726f 770a 6f6c 6c65 480a            dlrow.olleH.

% printf 'Hello\nworld\n' | tac -r -s 'x\|[^x]' | xxd
0000000: 0a64 6c72 6f77 0a6f 6c6c 6548            .dlrow.olleH
3
ответ дан 23 May 2018 в 16:14
  • 1
    Это отличный ответ, я не знал, что вы можете указать разделитель записи для tac. В то время как x\|[^x] действительно работает, кажется немного глупым использовать его, когда у вас есть метасимвол, соответствующий любому персонажу, сделанному специально: tac -r -s '.' input – kos 30 October 2015 в 11:59
  • 2
    Ах, извините, очевидно, . не соответствует символам новой строки. Шляпы, отличный ответ. – kos 30 October 2015 в 12:08

В пакете GNU coreutils имеется утилита с именем tac. Это линейная программа, поэтому она выводит каждую строку на стандартный вывод, последняя строка сначала - в отличие от каждого символа.

Команда rev (из пакета util-linux) основана на символах и он печатает каждую строку до стандартного вывода, изменяя порядок символов в каждой строке.

1
ответ дан 23 May 2018 в 16:14

Два разных подхода с использованием Perl:

1:

perl -e 'while($c=getc){$s=$c.$s};print($s)' <input

2:

perl -F'' -0777ae 'print(reverse(@F))' <input

1:

[ f4]: выполняет следующий аргумент; while($c=getc){$s=$c.$s}: сохраняет возвращаемое значение getc в $c и добавляет $c к $s, пока возвращаемое значение $c не будет определено; print($s): печать $s.

2:

-e: выполняет следующий аргумент: -0777ae: устанавливает разделитель входных данных на недопустимый символ (это предотвращает Perl от разбиение записей), разделяет поля ввода, сохраняя их в F, и выполняет скрипт, переданный в качестве аргумента; while($c=getc){$s=$c.$s}: сохраняет возвращаемое значение getc в $c и добавляет $c к $s, пока возвращаемое значение $c не будет определено,
% cat input
For instance, less allows you to read line by line, starting from the beginning.
Is there a similar utility or line that could be run in the terminal that could display a file backward character by character?
If not, how about a "cat" like utility that displays the entire file backward by character?
% perl -e 'while($c=getc){$s=$c.$s};print($s)' <input

?retcarahc yb drawkcab elif eritne eht syalpsid taht ytilitu ekil "tac" a tuoba woh ,ton fI
?retcarahc yb retcarahc drawkcab elif a yalpsid dluoc taht lanimret eht ni nur eb dluoc taht enil ro ytilitu ralimis a ereht sI
.gninnigeb eht morf gnitrats ,enil yb enil daer ot uoy swolla ssel ,ecnatsni roF
% perl -F'' -0777ae 'print(reverse(@F))' <input

?retcarahc yb drawkcab elif eritne eht syalpsid taht ytilitu ekil "tac" a tuoba woh ,ton fI
?retcarahc yb retcarahc drawkcab elif a yalpsid dluoc taht lanimret eht ni nur eb dluoc taht enil ro ytilitu ralimis a ereht sI
.gninnigeb eht morf gnitrats ,enil yb enil daer ot uoy swolla ssel ,ecnatsni roF
]
0
ответ дан 23 May 2018 в 16:14

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

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