是否有一个命令可以使另一个命令“就地”?

是否有一个命令可以使另一个命令“就地”?

我发现自己经常在 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

据我所知,没有一个通用实用程序可以使任何命令就地工作。

通常,当人们想要以编程方式就地编辑文件时,他们会使用sedor perlwith-i参数。

也许这就是为什么这个主题不经常出现的原因 - 与您可能认为的相反,如果有可以就地编辑文件的实用程序,则不需要那么多。

相关内容