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


12

除了使用临时文件提供帮助之外,还有一种方法/程序可以缓冲来自的输入,stdin但直到得到时才输出内容EOF。我也不想使用shell变量(例如buffer=$(cat))。

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

$ buffered-cat
line 1
line 2
line 3
^D # Ctr-D here(End of Line)

现在程序已接收^Dbuffered-cat输出内容

line 1
line 2
line 3

我通常sort用于此目的。显然,它具有一些不良后果。
阿德里安·普龙克

Answers:


20

一个穷人正在sponge使用awk

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

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

... | tac | tac

1
tac我认为这是简单而优雅的。
Ekeyme Mo

6
@EkeymeMo | tac | tac 简单,但是请记住,它对于任务效率非常低,并且会降低性能,特别是对于较大的文件。
Digital Trauma

@DigitalTrauma是的,我知道它的缺点。我测试了一个有十万行的文件。对我来说还好。我赞成您的评论,因为它是真的。
Ekeyme Mo

29

您可以sponge通过moreutils来实现sponge将“吸收标准输入并写入文件”。没有参数,该文件是标准输出。给出给该命令的输入将存储在内存中直到EOF,然后立即全部写入。

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

cmd | sponge filename

的主要目的sponge是允许在管道中读取和写入同一文件,但是它也可以满足您的需求。


6

只要您输入的是ASCII文本(直到结尾都不含NUL 0x0字节),然后sed -z您就可以执行以下操作:

$ sed -z ''
Line 1
Line 2
Line 3
^D
Line 1
Line 2
Line 3
$ 

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


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

sed ':l;N;bl'

4

sed解决方案比DigitalTrauma的解决方案长一点,但也适用于NUL字节。

sed -n 'H;${x;s/^\n//;p}'

2
sed ':l;N;bl'应该也可以。
Digital Trauma '01

1

您所要求的行为,这不是简单猫的默认行为吗?

gv@debian:$ cat << EOF #or cat <<EOF >file or cat <<EOF >/dev/stdout
> Line 1
> Line 2
> Line 3
> EOF
Line 1
Line 2
Line 3
gv@debian:$

3
不,这是此处文档的行为。尝试键入cat(Enter)Line 1(Enter),看看会发生什么。
G-Man说'恢复莫妮卡'

是的,这是这里文档结构。很简单,非常接近OP的需求。也不需要安装
Sergiy Kolodyazhnyy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.