有没有办法做这样的事情:
cat somefile.txt | sort | uniq > somefile.txt
即,我想列出整个文件,然后将一些操作传输到其内容,最后将结果放回源文件并完全覆盖它。现在我通过将输出放到临时文件,然后将其移到原始文件上来执行此操作。我想像 Linux 管道允许的那样以简单的方式执行此操作。
Shellbash
在 Linux 中cmd
很重要,在 Windows 中也是如此。
答案1
(回答 bash)
不。shell 首先处理重定向,然后截断文件。然后才cat
启动,并且使用空文件进行操作。
sponge
包中有一个名为的工具moreutils
可以让你执行此操作:
cat somefile.txt | sort | uniq | sponge somefile.txt
此命令可以简化(删除联合大学):
sort -u somefile.txt | sponge somefile.txt
无需sponge
写入临时文件,如果命令成功,则覆盖输入文件
tmpfile=$(mktemp)
sort -u somefile.txt > "$tmpfile" && mv "$tmpfile" somefile.txt
答案2
你可以在 Ex 模式下使用 Vim:
ex -sc 'sort u|x' somefile.txt
sort u
唯一排序x
保存并关闭