2009-03-16 23 views
46

Netleştirmek için, bir önceki numaralı numaralı arama işlemini gerçekleştirmenin bir yolunu arıyorum ve kullanılan önceki komutta değiştirin. ^word^replacement^ sadece ilk eşleşmeyi değiştiriyor gibi görünüyor.^kelime^değiştirme ^?

Bana ulaşan bazı set seçeneği var mı?

cevap

63

bu deneyin:

$ echo oneone 
oneone 
$ !!:gs/one/two/ # Repeats last command; substitutes 'one' --> 'two'. 
twotwo 
+0

Bu benim için çalışmıyor. 'İkişer' alıyorum – finnw

+0

Doğru yazdığınızdan emin misiniz? Benim için iyi çalışıyor. (GNU bash, sürüm 3.2.48 (1) -release kullanıyorum.) –

+1

sadece eski bir bash sürümünde test edildi ve (şaşırtıcı değil) işe yaramıyor: '$ echo $ BASH_VERSION' _ (2.05 .8 (1) -release) _ '$ echo oneone '_ (dışarı: bir başkasına) _ $: $ gs/bir/two' _ (dışarı: iki) _ ... ' $ echo $ BASH_VERSION '_ (out: 3.2.25 (1) -release) _ '$ echo oneone' _ (dışarı: bir kişi) _ $: $ gs/one/two' _ (out: twotwo) _ ... her şey için genel tavsiye bash? 3+ – michael

1

bir kötü bir yol böyle bir şey olabilir Bunu aşmanın:

L'ler değiştirerek BAABAA yerine BLABLA yankı ister A'lar

$ echo "BLABLA" 
BLABLA 
$ `echo "!!" | sed 's/L/A/g'` 
$(echo "echo "BLABLA" " | sed 's/L/A/g') 
BAABAA 
$ 

Maalesef bu teknik işe görünmüyor işlevler veya takma adlar.

+0

Hakkı:

Burada "myfile.txt" adlı bir dosyada bir dize yerine global olarak nasıl. Ayrıca, bu pahalı bir çatal oluşturur. Binlerce yinelemeyi içeren bir işlemde, bu önemli bir zaman aralığı yaratır. – xizdaqrian

5

John Feminella en benim cevap here harmanlayan bir takma ad isterseniz bunu yapabilirsiniz:

$alias dothis='`history -p "!?monkey?:gs/jpg/png/"`' 
$ls *.jpg 
monkey.jpg 
$dothis 
monkey.png 

!! Sadece önceki komutu yapar, iken!? string? "string" içeren son komutla eşleşir.

+0

Bu hiç işe yaramıyor. Maymun diye bir komut yoktu, bu yüzden benim tarihimde maymun –

-1

SUSE 10.1'de test ediyorum. "^ word^replacement ^" çalışmıyor, "^ word^replace" işlevi iyi çalışıyor. Bir örneği için : çift bölü kullanılması "global" string değiştirme gösterir

$ SENTENCE="1 word, 2 words";echo "${SENTENCE//word/replacement}" 
1 replacement, 2 replacements 

Not:

linux-geek:/home/Myworks # ls /etc/ld.so.conf 
/etc/ld.so.conf 
linux-geek:/home/Myworks # ^ls^cat 
cat /etc/ld.so.conf 
/usr/X11R6/lib/Xaw3d 
/usr/X11R6/lib 
/usr/i486-linux-libc5/lib=libc5 
/usr/i386-suse-linux/lib 
/usr/local/lib 
/opt/kde3/lib 
/opt/gnome/lib 
include /etc/ld.so.conf.d/*.conf 
linux-geek:/home/Myworks # 
+0

içeren hiçbir şey yok Ama bu sadece önceki satırdaki kelimenin * bir * örneğinin yerine geçer (komut olur). 'Ls/etc/passwd/etc/passwd' satırını' ^^ 'alt istasyon yöntemi ile' ls/etc/hosts/etc/hosts' olarak değiştirmeyi deneyin. –

4

Bu çözüm Bash alt dize Değiştirme kullanır.

Bu çözüm, tek satırda gerçekleştirilebilir.

$ sed -i -e "s/word/replacement/g" myfile.txt