选项 1:字符串替换

选项 1:字符串替换

我最近迁移到了 ZSH,我想更高效地替换命令中的参数。具体来说,我想替换最近调用的命令“cmd”中的参数“N”。我不想知道之前的参数模式是什么,我只希望替换整个参数。

例如,假设我的历史记录中有此命令,

foo arg-1 arg-2 arg-3

我想在下次调用时将第一个位置参数替换为“arg-replaced”。查看后zshexpn,我认为我可以这样做:

!foo:1:s/.*/arg-replaced/ [TAB]

预期结果:

foo arg-replaced arg-2 arg-3

但这会导致错误“zsh:替换失败”。

我看了看这个问题“如何在 zsh 中替换前一个命令的特定参数?“它看起来几乎就是我想要的,只是它只替换前一个命令,而不是搜索我的命令模式的历史记录。我觉得这应该是 zsh 扩展默认支持的东西,但我很难弄清楚如何实现它。

答案1

首先,!foo:1计算结果为arg-1,没有其他结果。所以,这不是您想要的。

第二,正如文档所述,历史扩展不会嵌套。因此,无法只foo arg-1 arg-2 arg-3在一个扩展语句中获取整个历史记录行,然后用某个内容替换它的第二个参数。

不过,话虽如此,还是有两种方法可以得到你想要的东西。

选项 1:字符串替换

如果你知道要替换的参数的实际值,那么你可以直接替换它。这很简单:

!foo:s/arg-1/arg-replaced

选项 2:实际参数替换

由于我们不能嵌套历史扩展,因此我们无法在一次替换中用索引替换参数。但是,没有什么可以阻止我们在同一命令行中使用多个历史扩展:

!foo:0 arg-replace !foo:2*

这两个的计算结果都是foo arg-replace arg-2 arg-3

相关内容