2009-03-16 6 views

risposta

63

Prova questo:

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

Questo non funziona per me. Ottengo 'twoone' – finnw

+0

Sei sicuro di averlo digitato correttamente? Funziona bene per me. (Sto usando GNU bash, versione 3.2.48 (1) -release.) –

+1

appena testato su una versione precedente di bash, e (non sorprendente) non funziona: '$ echo $ BASH_VERSION' _ (2.05 .8 (1) -release) _ '$ echo oneone' _ (out: oneone) _ ' $ !!: gs/one/two' _ (out: twoone) _ ... '$ echo $ BASH_VERSION' _ (out: 3.2.25 (1) -release) _ '$ echo oneone' _ (out: oneone) _ ' $ !!: gs/one/two' _ (out: twotwo) _ ... Consigli generali per tutte le cose bash? Usa la versione 3+ – michael

1

Un brutto modo per aggirare questo potrebbe essere qualcosa di simile:

vogliamo eco BAABAA piuttosto che BLABLA scambiando L's per di

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

Purtroppo questa tecnica non sembra funzionare in A funzioni o alias.

+0

destro. Inoltre, questo genera una forchetta costosa. In un'operazione che coinvolge migliaia di iterazioni, ciò creerebbe una significativa perdita di tempo. – xizdaqrian

5

Unendo la mia risposta here con John Feminella di si può fare questo se si vuole un alias:

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

La !! fa solo il comando precedente, mentre!? string? corrisponde al comando più recente contenente "stringa".

+0

Che non funziona affatto. Non c'era alcun comando chiamato scimmia, quindi nulla nella mia storia contenente scimmia –

-1

L'ho testato su SUSE 10.1. "^ parola^sostituzione ^" non funziona, mentre "^ parola^sostituzione" funziona bene. per un'istanza:

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

Ma sostituisce solo * una * istanza della parola sulla linea precedente (capita di essere il comando). Prova a cambiare la riga 'ls/etc/passwd/etc/passwd' in' ls/etc/hosts/etc/hosts' con il metodo '^^' sottostazione. –

4

Questa soluzione utilizza Bash Substring sostituzione:

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

noti l'uso delle doppie barre denota sostituzione "globale" stringa.

Questa soluzione può essere eseguita in un'unica riga.

Ecco come globalmente sostituire una stringa in un file chiamato "miofile.txt":

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