使用 bang dollar (`!$`) 的参数扩展

parameter expansion using bang dollar (`!$`)

有什么方法可以在参数扩展上下文中使用 !$ 吗?激发这个问题的理想用法是快速(根据击键)更改文件名(例如,不是将文件名保存在变量中并执行 rsvg-convert $svg > ${svg/.svg/.png},而是可以使用 rsvg-convert $! > $!{/.svg/.png},其中 $!{/.svg/.png} 是暗示预期效果的错误语法;当相关文件是前一行的最后一个标记时,这样的命令通常可以比替代方法更快地键入,例如在存在文件共享不同长度的前缀,或通过鼠标选择复制和粘贴文件名)。据我所知,在这种情况下无法使用 !$,但也许通过一些诡计可以达到类似的效果。

根据您希望替换的复杂程度,历史扩展确实支持用另一个字符串替换第一次出现的字符串。您只需在替换之前加上 :,例如:

rsvg-convert !$ > !$:s/.svg/.png

你可以看到所有历史修改器here

至少在 emacs-mode bash 如果你按 alt,也会将上一个命令的最后一个参数内联(当你 运行 命令时不用于扩展) +.。所以在这种情况下,输入可能是最快的:

rsvg-convert

然后alt+.>alt+. 然后删除它刚刚用 alt+bksp 放置的扩展然后是新的扩展: png

如果您进一步研究 Eric 示例中的修饰符,您还可以:

rsvg-convert !$ > !$:r.png

假设 .svg 当然是后缀