我使用zsh和emacs键绑定。有时我需要用不同的输入执行相同的命令。输入通常有共同的子串。是否有一种简单的方法可以用其他字符串替换以前命令的部分内容?例如,上一个命令是:
cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt
如何用'chr3'轻松替换'chr2'?
问题的扩展,如何将命令中的几个不同子串替换为其他不同的字符串:
cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered
如何用“chrX”代替“chr1”,用“chrZ”代替'chr2','chr3'?
感谢。
答案 0 :(得分:18)
您还可以使用^old^new
进行快速历史记录替换(比!!:s^old^new^
快很多)
~ % cd /tmp
/tmp % ^tmp^etc # <-- changes tmp for etc
/tmp % cd /etc
/etc %
这只会改变第一次出现。如果您需要更多,请使用任何历史修饰符。示例:全局更改:
/etc % echo tmp tmp tmp
tmp tmp tmp
/etc % ^tmp^etc
/etc % echo etc tmp tmp # <--- only the first tmp got changed
etc tmp tmp
/etc % ^tmp^etc^:G # <-- 'global'
PS:在zshexpn
手册中搜索^foo^bar
,找到描述此内容的部分。向下滚动一点(在手册中),您将看到“历史记录扩展修饰符”列表。
PS:对于多次替换,请执行:^old1^new1^:s^old2^new2^
等
答案 1 :(得分:6)
直接完成你的要求:
$ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/
这将修改输入的最后一个命令。要执行全局替换,请使用:gs/a/b/
。
示例:
$ man zshall
$ !!:gs/man/less/:gs/zshall/.history/<TAB>
$ less .history
在man zshexpn
- ZSH扩展和替换中阅读更多内容。