2009-03-16 11 views

Antwort

63

Versuchen Sie folgendes:

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

Das funktioniert nicht für mich. Ich bekomme 'twoone' – finnw

+0

Sind Sie sicher, dass Sie es richtig eingegeben haben? Es funktioniert gut für mich. (Ich benutze GNU Bash, Version 3.2.48 (1) -Release.) –

+1

gerade auf einer älteren Version von bash getestet, und (nicht überraschend) es funktioniert nicht: '$ echo $ BASH_VERSION' _ (2.05 .8 (1) -release) _ '$ echo oneone' _ (aus: oneone) _ ' $ !!: gs/one/two' _ (aus: twoone) _ ... '$ echo $ BASH_VERSION' _ (aus: 3.2.25 (1) -Release) _ '$ echo oneone' _ (aus: oneone) _ ' $ !!: gs/one/two' _ (aus: twotwo) _ ... Allgemeine Hinweise für alle Dinge Bash? Benutze Version 3+ – michael

1

Eine böse Art und Weise, dies zu umgehen so etwas wie dies sein könnte:

Wollen BAABAA statt BLABLA durch Vertauschen L's für A das Echo

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

Leider ist diese Technik scheint nicht zu funktionieren in Funktionen oder Aliase.

+0

Recht. Zusätzlich erzeugt dies eine teure Gabel. In einer Operation mit Tausenden von Iterationen würde dies zu einem erheblichen Zeitverlust führen. – xizdaqrian

5

Blending meine Antwort here mit John Feminella der Sie können dies tun, wenn Sie einen Alias ​​wollen:

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

Die !! macht nur den vorherigen Befehl, während!? string? entspricht dem letzten Befehl, der "string" enthält.

+0

Das funktioniert überhaupt nicht. Es gab keinen Befehl namens Affe, also nichts in meiner Geschichte mit Affen –

-1

Ich teste es auf SUSE 10.1. "^ word^replacement ^" funktioniert nicht, während "^ word^replacement" gut funktioniert. für eine Instanz:

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

Aber das ersetzt nur * eine * Instanz des Wortes in der vorherigen Zeile (ist zufällig der Befehl). Versuchen Sie, die Zeile 'ls/etc/passwd/etc/passwd' in' ls/etc/hosts/etc/hosts' mit der Unterarbeitsmethode '^^' zu ändern. –

4

Diese Lösung verwendet Bash Substring Replacement:

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

Beachten Sie die Verwendung der Doppelschrägstriche "global" string Ersatz bezeichnet.

Diese Lösung kann in einer Zeile ausgeführt werden.

Hier ist, wie eine Zeichenfolge in einer "myfile.txt" benannte Datei global ersetzen:

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