例如,less 允许您从头开始逐行读取。是否有类似的实用程序或行可以在终端中运行,可以逐个字符向后显示文件?如果没有,那么像“cat”这样的实用程序如何按字符向后显示整个文件?
答案1
这样做:
cat /tmp/aa | tac | rev
其中 tac 逐行反转文件并保持字符完整...然后 rev 通过简单地反转每一行的字符并保持逐行完整来完成它..例如:
cat /tmp/aa
Is there a way to read characters backwards from the end of a file in the terminal?
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?
cat /tmp/aa | tac | rev
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
lanimret eht ni elif a fo dne eht morf sdrawkcab sretcarahc daer ot yaw a ereht sI
答案2
您可以tac
单独使用 GNU 来逐个字符地向后读取文件,通过指定与每个字符匹配的“记录分隔符”:
# 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
tac
GNU 软件包中有一个名为的实用程序coreutils
。它是一个基于行的程序,因此它会打印每个线到标准输出,最后一行优先 – 而不是每个字符。
该rev
命令(来自util-linux
包)是基于字符的,它将每一行打印到标准输出,并反转每一行字符的顺序。
答案4
使用 Perl 的两种不同方法:
1:
perl -e 'while($c=getc){$s=$c.$s};print($s)' <input
2:
perl -F'' -0777ae 'print(reverse(@F))' <input
1:
-e
:执行以下参数;while($c=getc){$s=$c.$s}
:将的返回值存储getc
在中$c
,并将其添加到前面$c
,$s
直到的返回值$c
不为未定义;print($s)
: 印刷$s
。
2:
-F''
:取消设置输入字段分隔符(这会使 Perl 根据任意字符拆分字段);-0777ae
:将输入记录分隔符设置为无效字符(这会阻止 Perl 拆分记录),拆分输入的字段并将其存储到其中F
并执行作为参数传递的脚本;print(reverse(@F))
F
:以相反的顺序打印包含元素的数组的元素;
% 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