2010-01-27 18 views
39

Sadece Bash aşağıdaki komutu girdiyseniz: Ben yazarak bar foo değiştirebilirCaret arama ve Bash kabuk değiştirme

echo foo 

:

^foo^bar 

aşağıdaki komutu ile sonuçlanır yürütülmektedir:

echo bar 

Şimdi girerseniz:

echo foo foo 

Sadece kontrol çubuğunu (^) operatörünü kullanarak her iki foo örneğini değiştirmenin bir yolu var mı? Ayrıca

, ^ gibi kabuk operatörleri için orada adam sayfaları hangileri? "^ Için manuel giriş" in man ^ sonuçlanır.

+2

teşekkür yapılabilir yerine Daha kolay hatırlayabildiğim bir şey ama hat gürültüsü versiyonunu ezberlemem gerekecek gibi görünüyor. – mattjames

+1

Eğer "^ string1^string2" yi zaten "!!/s1/string1/string2 /" ile eşdeğer olduğunu düşünüyorsanız, "hat gürültüsü" versiyonunu hatırlamanız daha kolay olabilir. – isomorphismes

+0

@mattjames hatırlamak daha kolay bir şey istiyorsanız, daha az "hat gürültüsü" olan cevabımı kontrol edebilirsiniz -0 – MLP

cevap

48

Foo'ları yerine söylüyor ; onun dokümantasyon Bash Kılavuzunun Event Designators bölümünde bulunabilir. Hızlı ikame ile istediğini yapamazsın; Eğer biraz daha ayrıntılı bir şeye başvurmak gerekecek:

!!:gs/foo/bar/ 
+0

@scanny: Bu herhangi bir yerde belgelenmiş gibi görünmüyor ve benim için çalışmıyor bash 4.2.10 (1). Kabuğun hangi sürümünü kullanıyorsunuz ('bash --version')? –

+0

Oops, benim hatam, zsh, beyinde! : S Yorum silindi. – scanny

+0

OSX'de benim için iz bırakma gerekli değildi: '!!: gs/foo/bar' –

27

Ne de şapka ikamesi ile bunu nasıl emin, ancak burada tarihi ile bunun için gereken adımları:

!!:gs/foo/bar/ 

bana bunu yıkmak edelim:

!! - son komutu yeniden çalıştırır. Ayrıca kullanabilirsiniz -2 iki komut önce çalıştırmak için, yankı

ile başlar son komutu çalıştırmak için echo:!/Global (tüm örnekler) arama yapmak yerine diyor gs. Sadece ilk örneği değiştiririm istiyorsa şunları kullanırsınız ': s' Nihayet

,/foo/bar/belirli özellik hızlı ikame denir Yani çubuğun

5

Caret ikamesi ve diğer benzer kısayollar bash(1) adam sayfasının TARİHİ GENİŞLETME bölümün Olay Designatörleri alt bölümünde bulunmaktadır.

1
^word^ ........... erase word 
^word^^ ........... delete everything until the end of the line 
+3

Bunlar her ikisi de benim için aynı şeyi yapıyorlar: sadece komutu komuttan kaldır. –

+0

Aynı burada. '% Yankı "kelimesi sözcük sözcük sözcük sözcük" kelime kelime kelime kelime kelime %^kelime ^^ yankı "kelimesi kelimesi kelimesi kelimesi" kelime kelime kelime kelime ' – isomorphismes

21

Dene:

^foo^bar^:& 

sadece bir ikame ^foo^bar^ gerçekleştirir biliyorum ve :& değiştirici bunu tekrarlar gibi

.

+9

Bu iki oyuncu değişikliği ancak küresel bir ikame çalıştırır. – isomorphismes

+2

Çarpan ikamesine birden çok ": &" değiştiriciden geçebileceğinizi keşfettim. Yani ": &" tekrar demektir ve ": &: &" tekrar iki kez anlamına gelir, vb. (Yinelenen: Her tekrar için can sıkıcı olacak ve hakkında bilgi edinmek için çok mutluyum !!: gs //. – rickumali

0

Yukarıdaki !!:gs/foo/bar/ ile aynı şeyi gerçekleştiren ezberlemenin daha zor bir şey arıyorsanız, her zaman .bash_profile başlangıç ​​komut dosyanızda bir işlev oluşturabilirsiniz. Ben replace() seçti.

replace() { 
    eval $(echo $(fc -ln -1) | eval "sed 's/${1}/${2}/g'") #compact form 
} 

YA, Az sarmal

replace() { 
    string=$(fc -ln -1) #gets last command string 
    repcmmd="sed 's/${1}/${2}/g'" #build replacement sed command from fn input 
    eval $(echo $string | eval $repcmmd) #evaluates the replacement command 
} 

Sonra bütün beri çoğaltmaları^sözdizimi kullanmak için bir yol umuyordum, cevaplar için

echo foo foo 
replace foo bar 
İlgili konular