![BASH 历史记录操作:搜索替换](https://linux22.com/image/1267923/BASH%20%E5%8E%86%E5%8F%B2%E8%AE%B0%E5%BD%95%E6%93%8D%E4%BD%9C%EF%BC%9A%E6%90%9C%E7%B4%A2%E6%9B%BF%E6%8D%A2.png)
BASH 中有一个非常方便的参数/变量扩展功能,但我在历史记录中没有看到。我查看了历史记录和 BASH 本身的手册页。没有……也许我错过了。
例如:我经常使用 ssh,我可以使用变量扩展来做到这一点。
[email protected]
假设我只想提取主机——而是删除用户名。
hostonly=${host##*@}
如果我
echo $hostonly
我得到:
bar.org
我的问题: 是否可以使用命令行历史记录来执行此操作?
例如。,
命令 1:
ssh [email protected]
命令2:
ssh gary@!!:##*@
当然,这是行不通的,但是有人可以确认这种类型的模式匹配是否可用吗?
谢谢!
布布诺夫
答案1
人们经常忽略的一个巧妙技巧是命令r
(它本身是命令的一个特例fc
):
$ ssh [email protected]
(...)
$ r foo=baz
更一般的情况是
$ fc -s foo=bar ssh
它允许您通过子字符串从历史记录中选择一个命令,然后执行指定的替换并运行它。如果您省略-s
,它将加载命令$EDITOR
以进行更复杂的修改;命令行编辑大多使此操作变得不必要,但有些编辑很难在命令行上完成。
您还可以使用!
历史引用语法进行相当复杂的操作,但由于历史原因(基本历史机制是早期建立的csh
,所有增强功能大多保持了兼容性),它使用不同的语法。请参阅这里了解详情。
答案2
$ ssh [email protected]
...
$ ^foo^gary^
...
使用“gary”而不是“foo”作为用户名重复该命令。下面的操作方式相同:
$ ssh [email protected]
...
$ !!:s/foo/gary/
...