2009-03-16 29 views

Trả lời

63

Hãy thử điều này:

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

Điều này không phù hợp với tôi. Tôi nhận được 'haione' – finnw

+0

Bạn có chắc chắn đã nhập đúng không? Việc này ổn với tôi. (Tôi đang sử dụng GNU bash, phiên bản 3.2.48 (1) -release.) –

+1

vừa được thử nghiệm trên phiên bản cũ của bash, và (không ngạc nhiên) nó không hoạt động: '$ echo $ BASH_VERSION' _ (2.05 .8 (1) -release) _ '$ echo oneone' _ (ra: oneone) _ ' $ !!: gs/one/two' _ (trong: haione) _ ... '$ echo $ BASH_VERSION' _ (out: 3.2.25 (1) -release) _ '$ echo oneone' _ (out: oneone) _ ' $ !!: gs/one/two' _ (ra: twotwo) _ ... Lời khuyên chung cho mọi thứ bash? Sử dụng phiên bản 3+ – michael

1

Một cách pha vào bóng làm được việc này có thể là một cái gì đó như thế này:

Muốn vang BAABAA hơn BLABLA bằng cách trao đổi L's cho A của

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

Đáng tiếc là kỹ thuật này dường như không làm việc trong chức năng hoặc bí danh.

+0

Đúng vậy. Ngoài ra, điều đó tạo ra một ngã ba tốn kém. Trong một hoạt động liên quan đến hàng ngàn lần lặp lại, điều này sẽ tạo ra một thời gian kéo đáng kể. – xizdaqrian

5

Trộn câu trả lời của tôi here với John Feminella của bạn có thể làm điều này nếu bạn muốn có một bí danh:

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

Các !! chỉ có lệnh trước, trong khi!? string? khớp với lệnh gần đây nhất có chứa "chuỗi".

+0

Điều đó không hiệu quả chút nào. Không có lệnh gọi là khỉ, vì vậy không có gì trong lịch sử của tôi có chứa khỉ –

-1

Tôi kiểm tra nó trên SUSE 10.1. "^ word^replacement ^" không hoạt động, trong khi "^ word^replacement" hoạt động tốt. cho một ví dụ:

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

Nhưng chỉ thay thế * một * thể hiện của từ trên dòng trước đó (xảy ra là lệnh). Hãy thử thay đổi dòng 'ls/etc/passwd/etc/passwd' thành' ls/etc/hosts/etc/hosts' bằng phương thức '^^' substation. –

4

giải pháp này sử dụng Bash xâu thay thế:

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

Lưu ý việc sử dụng các dấu gạch chéo kép biểu thị "toàn cầu" chuỗi thay thế.

Giải pháp này có thể được thực hiện trong một dòng.

Dưới đây là làm thế nào để trên toàn cầu thay thế một chuỗi trong một file có tên "myfile.txt":

$ sed -i -e "s/word/replacement/g" myfile.txt 
Các vấn đề liên quan