Polecenie Bash, aby skopiować przed kursorem i wkleić po?

24

Nie jestem pewien, jak to powiedzieć, ale często zdarza mi się pisać takie polecenia:

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

Zazwyczaj po prostu wpisuję ścieżkę dwukrotnie (z uzupełnieniem tabulacji) lub skopiuję i wkleję ścieżkę kursorem. Czy jest jakiś bashfoo, który ułatwia pisanie?

użytkownik1028270
źródło
2
Myślę, że masz na myśli bash-fu:)
kot

Odpowiedzi:

43

Istnieje wiele sztuczek (myślę, że można znaleźć duplikat), ale zazwyczaj robię to

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

który zostanie rozszerzony na twoje polecenie.

Jest to nazywane rozszerzaniem nawiasów klamrowych . W użytej tutaj formie {}wyrażenie określa liczbę ciągów oddzielonych przecinkami. Te „rozszerzają” całe /etc/prog/dir1/myconfig.yml{,.bak}wyrażenie, zamieniając kolejno {}część z każdym ciągiem: pusty ciąg, dając /etc/prog/dir1/myconfig.yml, a następnie .bakdając /etc/prog/dir1/myconfig.yml.bak. Wynik to

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

Te wyrażenia mogą być zagnieżdżone:

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

produkuje

ab ac ade adf adg

Istnieje wariant wykorzystujący liczby do tworzenia sekwencji:

echo {1..10}

produkuje

1 2 3 4 5 6 7 8 9 10

i możesz również określić krok:

echo {0..10..5}

produkuje

0 5 10
Stephen Kitt
źródło
cholera, to słodkie. Doszedłem do wniosku, że nie jestem pierwszym, który zadaje, po prostu trudne pytanie do sformułowania.
user1028270,
Co tam robi przecinek?
user1028270,
5
Zobacz Brace Expansion w instrukcji: oddziela wartości użyte w interpretacji. Tutaj dwie wartości to pusty ciąg i .bak.
Stephen Kitt
12

Rozwijanie historii może być przydatne do tego rodzaju rzeczy (zakładając, że historia bash jest włączona).

W twoim przykładzie możesz wykonać:

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

Tutaj !#odnosi się do bieżącej linii, !#:1odnosi się do parametru 1 w bieżącej linii
i!#:1.bak odnosi się do parametru 1 na bieżącej linii z „.bak” sczepionym na końcu.

Po wypisaniu specyfikatora historii możesz użyć Ctrl+ Alt+E aby rozwinąć go do jego rzeczywistej wartości, jeśli chcesz np. Dwukrotnie sprawdzić lub zmodyfikować nazwę pliku.

Sekcja „Rozszerzenie historii” na stronach podręcznika bash zawiera więcej informacji.

Kupa
źródło
8

Podobne do odpowiedzi progo, ale nieco prostsze: C-wwycina („zabija”) słowo po lewej stronie kursora, C-ywstawia („szarpnie”) ponownie.

$ 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
Mindriot
źródło
2
Warto również zauważyć, że możesz to zrobić z wieloma słowami w rzędzie (jeśli na przykład w nazwie pliku są spacje) i Cy wklei je wszystkie, o ile nie przesunąłeś kursora ani nie wpisałeś niczego pomiędzy. Działa z tym dowolna kombinacja komend usuwania oprócz usuwania pojedynczych znaków (np. Backspace / del / ctrl-d).
Random832,
6

Możesz także wyciąć i wkleić (kill-yank w kategoriach emacs / bash) z wiersza poleceń, aby powielić części do edycji.

M-dzabija do przodu, aż do granicy słów, i możesz zabijać tekst wiele razy, a wszystkie łączą się w jedną „pastę” do szarpania. Wygodna!

Pociągnij to wszystko z powrotem do linii poleceń pod kursorem C-y. Więc jeśli masz taką linię (element blokowy █ wskazuje pozycję kursora):

$ 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

Tak czy inaczej wolisz to zrobić, zapoznanie się z tym, co bash ma do zaoferowania w interaktywnym dziale kluczy, będzie korzystne. http://web.mit.edu/gnu/doc/html/features_7.html

unperson325680
źródło
6

W tcshlub zsh, Alt+Ctrl+_w emacstrybie (copy-prev-word widget) wstawia ostatnie słowo, tak

cp bardzo długa ścieżka Alt+Ctrl+_.back

bashma copy-backward-wordwidżet (domyślnie niepowiązany z żadnym klawiszem), ale który kopiuje tylko słowo do bufora dzwonka, musisz także nacisnąć Ctrl-Y(w emacstrybie), aby go szarpnąć. Ale możesz zrobić:

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

Aby Alt+Ctrl+_zrobić zarówno kopię / snarf i wklej / yank jak w tcsh/ zsh.

Stéphane Chazelas
źródło