Truque unix para todas as instâncias no último comando?

97

Um dos meus truques favoritos do Unix é ^x^y, que pegará o último comando e substituirá a primeira instância de "x" por "y". No entanto, eu estou querendo saber se um truque semelhante funciona para substituir todas as instâncias de "x" por "y" no último comando?

Pedreiro
fonte
2
O recurso é chamado de expansão do histórico. Parece que usamos a command-historytag para isso. Adicionado. Além disso, suponho que você esteja se referindo ao bashshell?
Mikel

Respostas:

107

Você pode usar a !!:gs/search/replace/notação para fazer o que quiser. Isso utiliza a pesquisa global & replace ( :gs):

antes

$ echo "harm warm swarm barm"
harm warm swarm barm

depois de

$ !!:gs/arm/orn/
echo "horn worn sworn born"
horn worn sworn born

Referências

slm
fonte
1
@ slm este comando está substituindo apenas a primeira instância para mim. [subhrcho@slc04lyo pcbpel]$ echo "hat that bat" hat that bat [subhrcho@slc04lyo pcbpel]$ !!:gs/at/xx/ echo "hxx that bat" hxx that bat. o que estou perdendo?
24414 Geek
@ Geek - qual é a sua distro? Você está usando o Bash? Versão? bash --version= 4.2.45 (1) - liberação.
slm
@slm GNU bash, versão 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Direitos Autorais (C) 2005 Free Software Foundation, Inc.
Geek
@ Geek - uma versão muito antiga, não oferece esse recurso.
slm
46

Eu não acredito que há uma maneira fácil de adicionar algo a ^string1^string2fazer bashsubstituir todas as ocorrências. Como slm aponta, você deve escrever !!:gs/string1/string1.

Mas zsh, basta adicionar :G:

$ echo foo foo
foo foo
$ ^foo^bar^:G
echo bar bar
bar bar

Nos dois bashe zsh, você também pode usar fc -sassim:

$ echo foo foo
foo foo
$ fc -s foo=bar
echo bar bar
bar bar

Isso geralmente é transformado em um alias chamado rpara que você possa fazer:

$ echo foo foo
foo foo
$ r foo=bar
echo bar bar
bar bar
Mikel
fonte
Uau, isso também é muito legal
Mason
2

Eu acredito que a melhor opção é usar ": &"

$ echo "dog cat dog"
$ ^dog^cat^:&
echo "cat cat cat"
cat cat cat
Arthur Accioly
fonte
3
Isso substitui 2 ocorrências, não todas (bem, neste exemplo, pois existem apenas 2 ocorrências, mas não no caso geral). Você precisaria adicionar quantas :&houver mais ocorrências para substituir.
Stéphane Chazelas 30/04