有没有办法在终端从文件末尾向后读取字符?

有没有办法在终端从文件末尾向后读取字符?

例如,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

tacGNU 软件包中有一个名为的实用程序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

相关内容