Bash: Zamień wszystkie wystąpienia słowa w ostatnim poleceniu

14

Niemal przez pomyłkę doszedłem do wniosku, że możesz zrobić coś takiego:

$ cp foo.data bar1.data
$ ^bar1^bar2

I to uruchamia to samo polecenie z bar2.datazamiast bar1.data. A co powiesz na to, czy mam wiele wystąpień słowa docelowego? Na przykład:

$ cp foo.data bar.data
$ ^data^index

Zastępuje tylko pierwsze datarozszerzenie. Jak mogę go zastąpić?

Belmin Fernandez
źródło

Odpowiedzi:

22

Myślę, że ^data^indexjest równoważne !!:s/data/index, więc zastąpi tylko pierwsze słowo. Jeśli chcesz zastąpić całą linię, myślę, że będziesz musiał użyć!!:gs/data/index/

steabert
źródło
Ta zamiana (: gs / data / index) jest funkcją bashową, czy może domyślnie wywołuje inny program?
JohnTortugo,
Jest funkcją bash
Pablo Bianchi
7

Możesz to zrobić, dodając ^: & na końcu.
^: i zastąpi dwa wystąpienia
^: g & zastąpi wszystkie

$ cp foo.data bar.data
$ ^ data ^ index ^: &
$ cp foo.index bar.index
$ cp foo.data bar.data joe.data doe.data
$ ^ data ^ index ^: g &
$ cp foo.index bar.index joe.index doe.index

sidenote: w książce „linia poleceń kungfu”
jest napisane, że ^: & zastąpi wszystko

Uwaga 89
źródło
1
Właściwie ^:&dokona zamiany dwa razy . Aby zrobić wszystkie wystąpienia, użyj ^:g&( goznacza „globalny”).
G-Man,
Tnx! Nigdy nie testowałem tego więcej niż dwa razy. Przeczytaj polecenie w książce.
Note89