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/


Эта замена (: 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»
говорится, что ^: & заменит все


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

TNX! Я никогда не проверял это более двух раз. Прочитайте команду в книге.
Note89
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.