我最近迁移到了 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
。