remplacer les chaînes en ligne de commande zsh

J’utilise les raccourcis zsh et emacs. Quelque temps, je dois exécuter la même commande avec des entrées différentes. L’entrée a généralement des sous-chaînes communes. Existe-t-il un moyen facile de remplacer des parties d’une commande précédente par une autre chaîne? Par exemple, la commande précédente est:

cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt 

Comment pourrais-je facilement remplacer «chr2» par «chr3»?

Une extension à la question, comment remplacer plusieurs sous-chaînes différentes de la commande par d’autres chaînes:

 cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered 

Comment remplacer, disons «chr1» par «chrX», «chr2» par «chrY», «chr3» par «chrZ»?

Merci.

Vous pouvez aussi faire un remplacement rapide de l’ historique avec ^old^new (beaucoup plus rapide que !!:s^old^new^ )

 ~ % cd /tmp /tmp % ^tmp^etc # <-- changes tmp for etc /tmp % cd /etc /etc % 

Cela ne change que la première occurrence. Si vous avez besoin de plus, utilisez l'un des modificateurs d'historique. Exemple: changements globaux:

 /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: recherchez dans le manuel zshexpn ^foo^bar pour trouver la section décrivant ceci. Faites défiler un peu (dans le manuel), et vous verrez la liste des modificateurs d’extension de l’historique.

PS: pour les substitutions multiples, faire: ^old1^new1^:s^old2^new2^ etc

Pour réaliser ce que vous avez demandé directement:

 $ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/ 

cela modifiera la dernière commande saisie. Pour effectuer une substitution globale, utilisez :gs/a/b/ .

Exemple:

 $ man zshall $ !!:gs/man/less/:gs/zshall/.history/ $ less .history 

En savoir plus dans l’ man zshexpn – expansion et substitution ZSH.