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?


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


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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.