BASH history manipulation: search replace

0

Há um recurso de expansão de parâmetro / variável realmente útil no BASH que não vejo para o histórico. Eu verifiquei man pages para o histórico e para a própria BASH. Não está lá ... talvez eu tenha perdido.

Exemplo: Eu uso muito o ssh e posso fazer isso com expansão de variáveis.

[email protected]

Suponha que eu queira extrair apenas o host. Em vez disso, remova o nome de usuário.

hostonly=${host##*@}

Se eu

echo $hostonly

Eu recebo:

bar.org

Minha pergunta: É possível fazer isso com o histórico da linha de comando?

por exemplo,

Comando 1:

ssh [email protected]

Comando 2:

ssh gary@!!:##*@

Isso não funciona, é claro, mas alguém pode confirmar se esse tipo de correspondência de padrões está ou não disponível?

Obrigado!

Bubnoff

    
por Bubnoff 09.03.2011 / 03:24

2 respostas

2

Um truque que muitas vezes faltam às pessoas é o comando r (que é em si um caso especial do comando fc ):

$ ssh [email protected]
(...)
$ r foo=baz

O caso mais geral é

$ fc -s foo=bar ssh

que permite selecionar um comando do histórico por substring, executar a substituição especificada e executá-la. Se você deixar o -s , ele carregará o comando em $EDITOR para modificação mais complexa; A edição de linha de comando, na maioria das vezes, torna isso desnecessário, mas existem algumas edições que são difíceis de fazer na linha de comando.

Você também pode fazer manipulações bastante complexas usando a sintaxe de referência ! history, mas por razões históricas (o mecanismo básico de histórico foi estabelecido por early csh e todos os aprimoramentos mantiveram compatibilidade) usa uma sintaxe diferente. Consulte aqui para obter detalhes.

    
por 09.03.2011 / 03:53
0
$ ssh [email protected]
...
$ ^foo^gary^
...

O comando é repetido usando "gary" como nome de usuário em vez de "foo". O seguinte funciona da mesma maneira:

$ ssh [email protected]
...
$ !!:s/foo/gary/
...
    
por 09.03.2011 / 03:40

Tags