2013-04-25 9 views
7

Używam klawiszy skrótu zsh i emacs. W pewnym momencie muszę wykonać to samo polecenie z różnymi wejściami. Dane wejściowe mają zwykle wspólne podciągi. Czy istnieje prosty sposób na zastąpienie części poprzedniego polecenia innym łańcuchem? Na przykład poprzednie polecenie to:Zamień ciągi w linii poleceń zsh

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

Jak mogę łatwo zastąpić "chr2" przez "chr3"?

Rozszerzenie na pytanie, jak wymienić kilka różnych podciągi w poleceniu do innych różnych ciągów:

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

Jak wymienić, powiedzmy, „chr1” z „chrX”, „CHR2” wtih "chrY", "chr3" z "chrZ"?

Dzięki.

Odpowiedz

17

Można również zrobić szybki podstawienie historię z ^old^new (dużo szybciej niż !!:s^old^new^)

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

To zmienia tylko pierwsze wystąpienie. Jeśli potrzebujesz więcej, użyj dowolnego modyfikatora historii. Przykład: globalne zmiany:

/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: szukaj instrukcję zshexpn dla ^foo^bar znaleźć sekcję opisującą to. Przewiń w dół (w instrukcji), a zobaczysz listę "modyfikatorów rozszerzenia historii".

PS: W przypadku wielokrotnego podstawienia, zrobić: ^old1^new1^:s^old2^new2^ itp

6

Aby acomplish co prosiłeś bezpośrednio:

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

będzie modyfikować ostatnie polecenie wprowadzone. Aby wykonać globalne podstawienie, użyj :gs/a/b/.

przykład:

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

Więcej w man zshexpn - ZSH ekspansji i podstawienia.

+0

Dzięki za odpowiedź. Ponieważ Francisco zapewnia dwa sposoby, więc przyjąłem jego i przegłosowałem twoje. – Rainfield

+0

Cóż, prosiłeś o wielokrotne zastąpienia na raz, AFAIU '^ stary^nowy ^' umożliwia tylko jedno zastąpienie. –

+1

Zauważ, że '^ stary^nowy ^' jest po prostu synonimem '!!: s^foo^bar ^'. więc jeśli chcesz dokonać wielu zmian, możesz kontynuować tak, jak zrobiłeś. Zaktualizuję moją odpowiedź ... – Francisco