在zsh命令行中替换字符串

时间:2013-04-25 18:21:54

标签: linux command-line zsh

我使用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'?

感谢。

2 个答案:

答案 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扩展和替换中阅读更多内容。