İmleç önce kopyalayıp sonra yapıştırmak için Bash komutu?


24

Bunu nasıl söyleyeceğimi bilmiyorum ama sıklıkla kendimi böyle komutlar yazarken buluyorum:

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Genelde yolu sadece iki kez yazarım (sekme tamamlandı) veya yolu imleçle kopyalayıp yapıştıracağım. Bunu yazmayı kolaylaştıran bazı bashfoo var mı?


2
Sanırım demek istiyorsun bash-fu:)
kedi

Yanıtlar:


43

Birkaç püf noktası var (sanırım bulunacak bir kopyası var), ama bunun için yapmaya meyilliyim.

cp /etc/prog/dir1/myconfig.yml{,.bak}

bu senin emrine genişler.

Bu, ayraç genişletme olarak bilinir . Burada kullanılan formda, {}ifade virgüllerle ayrılmış birkaç dize belirtir. Bunlar, tüm /etc/prog/dir1/myconfig.yml{,.bak}ifadeyi "genişletir", {}parçayı sırayla her dizeyle değiştirir : boş dize, verme /etc/prog/dir1/myconfig.ymlve sonra .bakverme /etc/prog/dir1/myconfig.yml.bak. Sonuç

cp /etc/prog/dir1/myconfig.yml /etc/prog/dir1/myconfig.yml.bak

Bu ifadeler iç içe geçebilir:

echo a{b,c,d{e,f,g}}

üretir

ab ac ade adf adg

Dizileri üretmek için sayıları kullanan bir değişken var:

echo {1..10}

üretir

1 2 3 4 5 6 7 8 9 10

ve ayrıca adımı belirleyebilirsiniz:

echo {0..10..5}

üretir

0 5 10

kahretsin bu tatlı. İlk soran ben değildim, sadece biraz zor bir soru sorardım.
user1028270 12:16

Virgül orada ne yapıyor?
user1028270 12:16

5
Kılavuzdaki Brace Expansion bölümüne bakınız : genişlemede kullanılan değerleri ayırır. Burada iki değer boş dizedir ve .bak.
Stephen Kitt

12

Tarihin genişlemesi bu tür şeyler için faydalı olabilir (bash tarihinin etkin olduğunu varsayarsak).

Örnekte şunları yapabilirsiniz:

cp /etc/prog/dir1/myconfig.yml !#:1.bak

Burada !#, akım hattı belirtir !#:1satır üzerinde parametresi 1 anlamına gelir,
ve !#:1.bakucuna '.bak' tutturulmuş olan bir satır üzerinde parametresi 1 anlamına gelir.

Eğer tarih belirteci yazdığınız dışarı varsa, kullanabilirsiniz Ctrl+ Alt+ Eçift çek örneğin veya dosya adını değiştirmek istiyorsanız gerçek değerine genişletmek için.

Bash man sayfalarındaki "History Expansion" bölümü daha fazla bilgiye sahip.


8

Progo'nun cevabına benzer, ancak biraz daha basit: C-wimlecin solundaki kelimeyi keser (“öldürür”), C-ytekrar ekler (“yakar”).

$ cp /etc/dir1/myconfig.yml                              (C-w)
$ cp                                                     (C-y)
$ cp /etc/dir1/myconfig.yml                              (space, C-y)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml       (finish text)
$ cp /etc/dir1/myconfig.yml /etc/dir1/myconfig.yml.bak

2
Ayrıca, arka arkaya birden çok sözcükle yapabileceğinize dikkat edin (örneğin, dosya adınız boşluk içeriyorsa) ve Cy, imleci hareket ettirmediğiniz veya aralarında başka bir şey yazdığınız sürece, hepsini yapıştıracaktır. Tek karakterli silme işlemleri dışındaki herhangi bir silme komutu karışımı (örneğin, geri silme / del / ctrl-d) bununla çalışır.
Random832

6

Ayrıca, düzenleme için parçaları çoğaltmak için komut satırından kesin olarak yapıştırın (emacs / bash terimlerinde kill yank)).

M-dkelime sınırına kadar ileri doğru öldürür ve metni birden çok kez öldürebilir ve hepsi yanıklanma için tek bir 'yapıştırma' ile birleştirilir. Kullanışlı!

Tüm bunları imlecindeki komut satırına geri döndür C-y. Öyleyse böyle bir çizginiz varsa (element blok elemanı imleç pozisyonunu gösterir):

$ cp avb.txt                 (M-b M-b)
$ cpavb.txt                  (M-d) kill the word 'avb'
$ cp █.txt                    (C-y) yank it back
$ cp avb█.txt                 (C-e) to the end of line
$ cp avb.txt                 (C-y) yank it again
$ cp avb.txt avb             finish the line
$ cp avb.txt avb.foo

Her iki şekilde de yapmayı tercih ediyorsanız, etkileşimli anahtar departmanında bash'ın size sunduğu şey hakkında bilgi sahibi olmanız faydalı olacaktır. http://web.mit.edu/gnu/doc/html/features_7.html


6

Olarak tcshya da zsh, Alt+Ctrl+_içinde emacsmodu ( copy-prev-wordeklendi) böylece, son sözü ekler

cp çok uzun yol Alt+Ctrl+_.

bashbir copy-backward-wordwidget (varsayılan olarak herhangi bir tuşa bağlı değildir) vardır, ancak sözcüğü yalnızca çalma arabelleğine kopyalar, onu seçmek için Ctrl-Y( emacsmodunda) da basmanız gerekir. Ama yapabilirsin:

bind '"\e[cpw~": copy-backward-word'
bind '"\e\C-_": "\e[cpw~\C-Y"'

Sahip olmak Alt+Ctrl+_gibi / yank hem kopyalama / Snarf yapmak ve yapıştırmak tcsh/ ' zsh.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.