一个可以缓冲标准输入或文件的程序

Eke*_* Mo 14 shell buffer stdout

除了使用临时文件来提供帮助之外,是否有一种方法/程序可以缓冲输入,stdin但在获取EOF. 我也不想使用 shell 变量(例如buffer=$(cat))。

该程序应如下所示(假设程序名称为buffered-cat):

$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)
Run Code Online (Sandbox Code Playgroud)

现在程序收到了^Dbuffered-cat输出内容

line 1
line 2
line 3
Run Code Online (Sandbox Code Playgroud)

Mic*_*mer 31

您可以使用spongefrom moreutils执行此操作sponge将“吸收标准输入并写入文件”。没有参数,该文件是标准输出。给这个命令的输入存储在内存中直到 EOF,然后一次全部写出。

要写入普通文件,您只需提供文件名:

cmd | sponge filename
Run Code Online (Sandbox Code Playgroud)

的主要目的sponge是允许从管道内的同一个文件中读取和写入,但它也可以执行您想要的操作。


mur*_*uru 21

一个穷人的sponge使用awk

awk '{a[NR] = $0} END {for (i = 1; i <= NR; i++) print a[i]}'
Run Code Online (Sandbox Code Playgroud)

如果你有tac,你也可以滥用它:

... | tac | tac
Run Code Online (Sandbox Code Playgroud)

  • @EkeymeMo`| tac | tac` * 是* 简单,但请记住,它对于任务来说效率非常低,并且您将遭受性能损失,尤其是对于较大的文件。 (7认同)

Dig*_*uma 6

只要您的输入是 ASCII 文本(直到最后sed -z不包含 NUL 0x0 字节),然后执行您想要的操作:

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 
Run Code Online (Sandbox Code Playgroud)

-z原因sed治疗NUL字节作为一个行定界符而不是通常的换行符。因此,只要您的输入是没有 NUL 字节的常规文本,那么 sed 就会继续将整个输入读入其模式缓冲区,直到达到 EOF。 sed然后不对缓冲区进行处理并输出它。


如果输入中存在 NUL 字节,则可以改为执行以下操作:

sed ':l;N;bl'
Run Code Online (Sandbox Code Playgroud)