^ x ^ y unix trick cho tất cả các trường hợp trong lệnh cuối cùng?


97

Một trong những thủ thuật Unix yêu thích của tôi là ^x^y, nó sẽ thực hiện lệnh cuối cùng và thay thế phiên bản đầu tiên của "x" bằng "y". Tuy nhiên, tôi tự hỏi liệu một thủ thuật tương tự có hoạt động để thay thế tất cả các trường hợp "x" bằng "y" trong lệnh cuối cùng không?


2
Tính năng này được gọi là mở rộng lịch sử. Có vẻ như chúng tôi sử dụng command-historythẻ cho điều đó. Thêm. Ngoài ra, tôi giả sử bạn đang đề cập đến bashvỏ?
Mikel

Câu trả lời:


107

Bạn có thể sử dụng !!:gs/search/replace/ký hiệu để làm những gì bạn muốn. Điều này sử dụng tìm kiếm toàn cầu & thay thế ( :gs):

trước

$ echo "harm warm swarm barm"
harm warm swarm barm

sau

$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born

Người giới thiệu


1
@slm lệnh này chỉ thay thế phiên bản đầu tiên cho tôi. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. Tôi đang thiếu gì?
Geek

@Geek - distro của bạn là gì? Bạn đang sử dụng Bash? Phiên bản? bash --version= 4.2,45 (1) - giải phóng.
slm

@slm GNU bash, phiên bản 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Bản quyền (C) 2005 Free Software Foundation, Inc.
Geek

@Geek - một phiên bản quá cũ, không cung cấp tính năng này.
slm

46

Tôi không tin rằng có một cách dễ dàng để thêm một cái gì đó để ^string1^string2làm bashthay thế mỗi lần xuất hiện. Như slm chỉ ra, bạn phải viết !!:gs/string1/string1.

Nhưng trong zsh, bạn chỉ có thể thêm :G:

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

Trong cả hai bashzsh, bạn cũng có thể sử dụng fc -snhư thế này:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

Điều này thường được tạo thành một bí danh được gọi rđể bạn có thể thực hiện:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar

Ồ, cái này cũng rất gọn gàng
Mason

2

Tôi tin rằng tùy chọn tốt nhất là sử dụng ": &"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat

3
Điều đó thay thế 2 lần xuất hiện, không phải tất cả trong số đó (tất cả trong ví dụ này vì chỉ có 2 lần xuất hiện, nhưng không phải trong trường hợp chung). Bạn cần thêm nhiều :&lần để thay thế.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.