2013-04-25 3 views
7

Ich benutze zsh und Emacs Tastenkombinationen. Irgendwann muss ich denselben Befehl mit verschiedenen Eingaben ausführen. Die Eingaben haben üblicherweise gemeinsame Teilstrings. Gibt es eine einfache Möglichkeit, Teile des vorherigen Befehls durch eine andere Zeichenfolge zu ersetzen? Zum Beispiel ist der vorherige Befehl:Ersetzen Sie Strings in Zsh-Befehlszeile

Wie könnte ich einfach "chr2" durch "chr3" ersetzen?

Eine Erweiterung auf die Frage, wie in dem Befehl zu anderen verschiedenen Saiten mehrere verschiedene Teil ersetzen:

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

Wie zu ersetzen, sagen wir mal, ‚chr1‘ mit ‚CHRX‘, ‚ChR2‘ wtih 'chrY', 'chr3' mit 'chrZ'?

Danke.

Antwort

17

Sie können auch mit ^old^new (viel schneller als !!:s^old^new^)

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

Dies ändert sich nur das erste Vorkommen schnell Geschichte Substitution tun. Wenn Sie mehr benötigen, verwenden Sie einen der Änderungsmodifikatoren. Beispiel: globale Veränderungen:

/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: Suche | zshexpn Handbuch für ^foo^bar den Abschnitt finden beschreiben diese. Scrollen Sie ein wenig nach unten (in der Anleitung), und Sie sehen die Liste der 'History Expansion Modifiers'.

PS: Für mehrere Substitution tun: ^old1^new1^:s^old2^new2^ etc

6

Um acomplish was Sie direkt gefragt:

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

dies wird der letzte Befehl eingegeben ändern. Um eine globale Ersetzung durchzuführen, verwenden Sie :gs/a/b/.

Beispiel:

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

Lesen Sie mehr in man zshexpn - ZSH Expansion und Substitution.

+0

Vielen Dank für Ihre Antwort. Da Francisco zwei Möglichkeiten bietet, habe ich seine angenommen und deine erhöht. – Rainfield

+0

Nun, Sie haben nach mehreren Ersetzungen auf einmal gefragt, AFAIU '^ old^new ^' erlaubt nur eine Ersetzung. –

+1

Beachten Sie, dass '^ alt^new ^' auch nur '': s^foo^bar^'ist. Wenn Sie also mehrere Ersetzungen durchführen möchten, können Sie genauso fortfahren wie Sie. Ich werde meine Antwort aktualisieren ... – Francisco