我发现自己经常在 shell 中尝试就地“编辑”文件。比如说,我想删除包含words.txt
该字母的所有行e。然后,我会执行:
$ grep -v e words.txt > words-without-e.txt
$ mv words-without-e.txt words.txt
许多人很困惑为什么在执行以下命令时会留下一个空文件(我没有):
$ grep -v e words.txt > words.txt
grep: words.txt: input file is also the output
某些命令具有用于就地行为的特殊标志,例如--in-place
(请参阅sed(1)
)以允许这样做。可以使用sponge(1)
,但这需要我输入文件名两次,这是我不喜欢的。
$ grep -v e words.txt | sponge words.txt
我定义了一个我觉得很方便的函数:
function inplace { "${@:2}" < "$1" | sponge $1 }
有了它,我现在可以做:
$ inplace words.txt grep -v e
我知道这仅限于“流处理”,即采用标准输入、处理它并产生标准输出的命令。但许多命令都是如此。
也许我找错了地方,但我还没有偶然发现类似的定义,特别是考虑到有关就地编辑的问题出现的频率。
- 是否有一个通用的实用程序可以达到相同的目的?
- 你定义过这样的函数吗?你的定义是怎样的?你叫它什么?
- 为什么这种情况不经常出现?或者我只是错过了?
答案1
据我所知,没有一个通用实用程序可以使任何命令就地工作。
通常,当人们想要以编程方式就地编辑文件时,他们会使用sed
or perl
with-i
参数。
也许这就是为什么这个主题不经常出现的原因 - 与您可能认为的相反,如果有可以就地编辑文件的实用程序,则不需要那么多。