在Linux中即时更改文件(写入pipe道上的input文件)

如何在pipe道上随时更改文件?

我可能正在寻找一种方法来缓冲一个文件在一个pipe道的开始,这是相反的:

cat foo.txt | grep bar > foo.txt 

…将保留来自pipe道本身的破坏的input数据。 股票有这样的缓冲吗?

我猜想sed仍然可能创build临时文件,但下面可能做你想要的? (对此使用strace可能会显示您是否sed创build临时文件)。

 sed -i '/bar/!d' foo.txt 

惊叹号反转匹配,d是删除,所以这删除所有行中没有他们的酒吧。

尝试使用像这样的moreutils海绵:

 sed "s/root/toor/" /etc/passwd | grep -v joey | sponge /etc/passwd 

它在写入输出之前收集整个input。

使用>>来保存内容。

cat foo.txt | grep bar >> foo.txt

现在将附加到该文件。

AFAIK,没有直接的方法来将数据预先加载到shell中的文件中。 如果你想预先安装,你可能需要在两者之间使用一个临时文件。

根据你的命令行有多复杂,你可能会得到一些里程

 cat foo.txt | grep bar | tee -a foo.txt 

要做到这一点,最好的方法就是记住unix中的文件是如何工作的 – 只要文件存在链接(打开文件的目录或进程),文件就存在。

因此,打开该文件,删除该目录条目,然后运行写入具有相同名称但链接到不同inode的新目录条目的进程。

最后,关于这一点的好处是,它可以用于任何types的stream水线操作,而不仅仅是可以执行临时文件缓冲区的东西。

 { rm file ; sed -es/this/that/g > file ; } < file 

一个警告的话 – 如果你必须重写是一个primefaces操作,这可能会导致灾难。 unix不提供locking文件的干净方式,特别是在shell级别。 这是黑暗时代的一个问题,如果你在像NIS那样运行的系统上编辑密码文件。 任何时候,不止一个进程正在读取/写入文件,如果您的系统繁忙或重要,请非常小心。

只有100%肯定是primefaces的操作是目录项操作 – rm / ln / mv(在同一个文件系统上)。

所以现在事情变得更长,更丑陋..

这个math部分需要一个posix shell或类似的扩展bourne shell

 c=0 while f=$SECONDS test -f file.$c.tmp do c=$(($c+1)) done grep stuff < file > file.$c.tmp && mv file.$c.tmp file 

Ooops,UUOC,无用的猫咪:)你不需要那里的猫:

 grep something somefile > someotherfile 

正如sekenre所说,有海绵。 或者,也许你可能想尝试Perl内联版(-i切换):

  • 只打印匹配输出:

    perl -ni -e'm / foo / g并打印'bar.txt

  • 在文件中用“bar”replace“foo”

    perl -pi -e's / foo / bar / g'bar.txt