是否有任何干净、清晰的 POSIX 等价物tac
?
可读性和简洁性都应该考虑。
答案1
最干净的POSIX相当于
tail -r
作为
-r Reverse. Copies lines from the specified starting point in
the file in reverse order. The default for r is to print the
entire file in reverse order.
已接受下一个POSIX问题(希望它很快就会在所有平台上得到支持)。
如果tail -r
不可用,可以成功使用“经典”文本处理工具(正如您和其他人所展示的那样)来反转文件中的行。
撇开可读性和简洁性不谈,即使是老的ed
也能做到:
ed -s infile <<\IN
g/^/m0
,p
q
IN
或者,如果您想要反转管道的输出 - 首先将其读入文本缓冲区:
ed -s <<\IN
r ! your | pipeline | goes | here
g/^/m0
,p
q
IN
答案2
您可以使用sed
一行代码来完成此操作,如下所示,尽管它对于“外行”来说肯定不可读:
sed -n '1h;1!{x;H;};${g;p;}' file.txt
解释:
-n
禁止sed
打印每一行的默认操作。
1h
导致第一行存储在保留空间中。
1!{...}
将此命令块应用于所有行除了对于第一个。
x
交换保持空间和模式空间。 (模式空间是处理每行时存储的位置。)然后H
将换行符附加到保留空间,后跟模式空间的(新)内容。
${...}
仅当到达最后一行时才应用 最后一个块。g
获取保留空间的内容并将其放入模式空间,并p
打印模式空间。
当然,这取决于能否将整个文件一次性保存在内存中;它可能会在非常大的文件上失败。
答案3
这是一个将整个文件存储在内存中的 awk 脚本:
awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' file
表述为 shell 函数:
tac () { awk '{line[NR]=$0} END {for (i=NR; i>=1; i--) print line[i]}' "$@"; }