2013-04-25 13 views
7

Uso le associazioni di tasti zsh ed emacs. A volte ho bisogno di eseguire lo stesso comando con input diversi. L'input ha usualmente sottostringhe comuni. C'è un modo semplice per sostituire parti del comando precedente con qualche altra stringa? Ad esempio, il comando precedente è:sostituire stringhe nella riga di comando zsh

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

Come è possibile sostituire facilmente 'chr2' con 'chr3'?

Un'estensione alla domanda, come sostituire diverse sottostringhe differenti nel comando ad altre stringhe differenti:

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

Come sostituire, diciamo, 'chr1' con 'chrX', 'ChR2' addebbitato 'chrY', 'chr3' con 'chrZ'?

Grazie.

risposta

17

Si può anche fare veloce sostituzione storia con ^old^new (molto più veloce di !!:s^old^new^)

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

Questo cambia solo la prima occorrenza. Se hai bisogno di più, usa uno qualsiasi dei modificatori di cronologia. Esempio: cambiamenti globali:

/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: ricerca manuale zshexpn per ^foo^bar per trovare la sezione che descrive questo. Scorri verso il basso un po '(nel manuale) e vedrai l'elenco dei' modificatori di espansione della cronologia '.

PS: Per la sostituzione multipla, fare: ^old1^new1^:s^old2^new2^ ecc

6

Per compire quello che hai chiesto direttamente:

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

Ciò modificherà l'ultimo comando immesso. Per eseguire la sostituzione globale, utilizzare :gs/a/b/.

Esempio:

$ man zshall 
$ !!:gs/man/less/:gs/zshall/.history/<TAB> 
$ less .history 

Leggi tutto in man zshexpn - espansione ZSH e la sostituzione.

+0

Grazie per la risposta. Dal momento che Francisco offre due modi, quindi ho accettato il suo e il tuo. – Rainfield

+0

Bene hai chiesto più sostituzioni contemporaneamente, AFAIU '^ vecchio^nuovo ^' consente solo una sostituzione. –

+1

Si noti che '^ old^new ^' è anche sinonimo di '!!: s^foo^bar ^'. quindi se desideri fare più sostituzioni, puoi procedere come hai fatto tu. Aggiornerò la mia risposta ... – Francisco

Problemi correlati