2013-04-25 36 views
7

Tôi sử dụng khóa móc khóa zsh và emac. Một thời gian tôi cần phải thực hiện cùng một lệnh với đầu vào khác nhau. Các đầu vào ususally có chất nền phổ biến. Có một cách dễ dàng để thay thế các phần của lệnh trước đó với một số chuỗi khác? Ví dụ: lệnh trước là:thay thế chuỗi trong dòng lệnh zsh

cat chr2.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr2.unknow.withpvalue.feature.filtered > chr2.combined.txt 

Tôi có thể dễ dàng thay thế 'chr2' bằng 'chr3' bằng cách nào?

Một phần mở rộng cho câu hỏi, làm thế nào để thay thế chuỗi con khác nhau trong lệnh thành các chuỗi khác nhau khác:

cat chr1.unknow.feature.filtered ../chr2.unknow.feature.filtered ../train/chr3.unknow.withpvalue.feature.filtered 

Làm thế nào để thay thế, chúng ta hãy nói, 'chr1' với 'chrX', 'chr2' wtih 'chrY', 'chr3' với 'chrZ'?

Cảm ơn.

Trả lời

17

Bạn cũng có thể làm nhanh thay lịch sử với ^old^new (nhanh hơn rất nhiều so với !!:s^old^new^)

~ % cd /tmp 
/tmp % ^tmp^etc # <-- changes tmp for etc 
/tmp % cd /etc 
/etc % 

này chỉ thay đổi sự xuất hiện đầu tiên. Nếu bạn cần nhiều hơn, hãy sử dụng bất kỳ công cụ sửa đổi lịch sử nào. Ví dụ: thay đổi toàn cầu:

/etc % echo tmp tmp tmp 
tmp tmp tmp 
/etc % ^tmp^etc 
/etc % echo etc tmp tmp # <--- only the first tmp got changed 
etc tmp tmp 
/etc % ^tmp^etc^:G  # <-- 'global' 

PS: tìm kiếm hướng dẫn zshexpn cho ^foo^bar để tìm phần mô tả này. Cuộn xuống một chút (trong sách hướng dẫn) và bạn sẽ thấy danh sách 'các công cụ sửa đổi mở rộng lịch sử'.

PS: Để thay thế nhiều, hãy làm: ^old1^new1^:s^old2^new2^ vv

6

Để acomplish gì bạn yêu cầu trực tiếp:

$ !!:s/chr1/chrX/:s/chr2/chrY/:s/chr3/chrZ/ 

này sẽ sửa đổi lệnh cuối cùng bước vào. Để thực hiện thay thế toàn cục, hãy sử dụng :gs/a/b/.

Ví dụ:

$ man zshall 
$ !!:gs/man/less/:gs/zshall/.history/<TAB> 
$ less .history 

Đọc thêm tại man zshexpn - mở rộng ZSH và thay thế.

+0

Cảm ơn câu trả lời của bạn. Vì Francisco cung cấp hai cách, vì vậy tôi chấp nhận của mình và upvote của bạn. – Rainfield

+0

Bạn đã yêu cầu nhiều lần thay thế cùng một lúc, AFAIU '^ old^new ^' chỉ cho phép thay thế một lần. –

+1

Lưu ý rằng '^ old^new ^' chỉ là đồng nghĩa với '!!: s^foo^bar ^'. vì vậy nếu bạn muốn thực hiện nhiều thay thế, bạn có thể tiến hành giống như bạn đã làm. Tôi sẽ cập nhật câu trả lời của tôi ... – Francisco

Các vấn đề liên quan