在zsh命令行中替换字符串

Rai*_*eld 8 linux command-line zsh

我使用zsh和emacs键绑定.有时我需要用不同的输入执行相同的命令.输入通常有共同的子串.是否有一种简单的方法可以用其他字符串替换以前命令的部分内容?例如,上一个命令是:

cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt
Run Code Online (Sandbox Code Playgroud)

我怎么能用'chr3'轻松替换'chr2'?

问题的扩展,如何将命令中的几个不同的子串替换为其他不同的字符串:

cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered
Run Code Online (Sandbox Code Playgroud)

如何用"chrX"代替"chr1",用"chrZ"替换'chr2','chr3'?

谢谢.

Fra*_*sco 18

你也可以做快速的历史替换^old^new(比快得多!!:s^old^new^)

~ % cd /tmp
/tmp % ^tmp^etc  # <-- changes tmp for etc
/tmp % cd /etc
/etc % 
Run Code Online (Sandbox Code Playgroud)

这只会改变第一次出现.如果您需要更多,请使用任何历史修饰符.示例:全局更改:

/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'
Run Code Online (Sandbox Code Playgroud)

PS:搜索zshexpn手册^foo^bar以查找描述此内容的部分.向下滚动一点(在手册中),您将看到"历史记录扩展修饰符"列表.

PS:对于多次替换,请执行:^old1^new1^:s^old2^new2^


Tom*_*ner 7

要完成你直接要求的内容:

$ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/
Run Code Online (Sandbox Code Playgroud)

这将修改输入的最后一个命令.要执行全局替换,请使用:gs/a/b/.

例:

$ man zshall
$ !!:gs/man/less/:gs/zshall/.history/<TAB>
$ less .history
Run Code Online (Sandbox Code Playgroud)

阅读更多内容man zshexpn- ZSH扩展和替代.