Bash: заменить все вхождения слова в последней команде

14

Почти по ошибке я понял, что вы можете сделать что-то вроде:

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

И это выполняет ту же команду с bar2.dataвместо bar1.data. Теперь, как насчет того, если у меня есть несколько вхождений целевого слова? Например:

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

Он заменяет только первое dataрасширение. Как мне заставить его заменить оба?

Бельмин Фернандес
источник

Ответы:

22

Я думаю, что ^data^indexэквивалентно !!:s/data/index, так что это будет только заменить первое слово. Если вы хотите заменить всю строку, я думаю, вам придется использовать!!:gs/data/index/

steabert
источник
Эта замена (: gs / data / index) является функцией bash или она неявно вызывает другую программу?
JohnTortugo
7

Вы можете сделать это, добавив ^: & в конец.
^: & заменит два вхождения
^: g & заменит все

$ cp foo.data bar.data
$ ^ данные ^ индекс ^: &
$ cp foo.index bar.index
$ cp foo.data bar.data joe.data doe.data
$ ^ данные ^ индекс ^: г &
$ cp foo.index bar.index joe.index doe.index

sidenote: в книге «Командная строка Kungfu»
говорится, что ^: & заменит все

Note89
источник
1
Собственно, ^:&сделаю замену дважды . Чтобы сделать все вхождения, используйте ^:g&( gрасшифровывается как «глобальный»).
G-Man говорит: «Восстановите Монику»
TNX! Я никогда не проверял это более двух раз. Прочитайте команду в книге.
Note89