#文件内容 #打开文件 #重定向 #海绵 #原地 #输入输出 #读取文件

app rewrite

安全地重写从 stdin 读取的文件内容,即使文件作为输入打开

3 个版本 (1 个稳定版)

1.0.0 2021年3月3日
0.2.0 2017年3月1日
0.1.0 2017年2月23日

#361 in 文本处理

每月 22 次下载

MIT 许可证

11KB
131

rewrite 快速入门

这是什么

rewrite 是一个简单的命令行工具,允许原地重写文件的内容,即使文件正在作为输入读取。这使得通过其他标准 Unix 工具转换文件内容变得非常简单,即使它们期望输入和输出文件/流在物理上分离。

问题

您有一系列链式操作/命令,该命令从给定的文件 file 读取,并希望用该命令链的结果替换 file 的内容。如果您尝试通过类似 > file 或甚至 | tee file 的方式重定向脚本的输出,您会发现您往往会丢失所有内容并损坏数据。这是因为上游命令正在从正在写入的同一文件中读取,用输出覆盖输入。

解决方案

rewrite 使您能够轻松解决此问题。只需将您的管道/工作流程的输出通过 rewrite file 管道,您就会得到您预期的结果。易如反掌!

示例

假设我们想要对一个文件进行排序。我们不想排序 文件的副本,我们想排序 文件本身(显然)。不幸的是,这并不容易。以下是一个示例,其中我们从一个词典文件中选择1024个随机单词,然后想要对输出进行排序。

shuf -n 1024 /usr/share/dict/words > words.txt

我们可以轻松地使用 sort 工具对列表进行排序,但当我们尝试将输出保存到自身时会发生什么?

sort words.txt > words.txt # don't do this!

这将导致数据完全丢失,因为外壳在 sort 有机会打开相同的文件进行读取之前就会设置输出文件句柄。最后,您既没有这个也没有那个,而且在整个过程中丢失了所有数据!

这就是您通常会做的事情

sort words.txt > temp
mv temp words.txt

这很简单,很直接,除非sort是更大工作流程或脚本的一部分,或者你忘记了,或者temp已经存在,或者你没有足够直接的情况,没有意识到你的源文件和目标文件是相同的。这时rewrite就能派上用场了!

下面是如何简单使用rewrite的示例

sort words.txt | rewrite words.txt

内部来说,rewrite会执行所有“魔法”,从stdin读取并缓冲内容,直到上游命令执行完成,然后相应地写入命名文件。

安装rewrite

rewrite是用Rust编写的,旨在提高性能、安全性和开箱即用的跨平台支持。安装rewrite(假设在你的平台和最喜欢的包管理器中还没有提供二进制文件)就像这样简单

cargo install rewrite

为Windows、Linux、FreeBSD和OS X提供预构建的二进制文件。欢迎在平台原生的包管理器上提供打包和分发支持。

依赖关系

截至版本1.0,rewrite没有任何依赖关系(原生或其他)。

许可协议

rewrite在MIT许可协议的条款下发布,不提供任何保证,希望对公众有用。rewrite由Mahmoud Al-Qudsi编写,并由NeoSmart Technologies赞助。

无运行时依赖