Pergunta

Existe uma maneira de executar uma substituição de string regexp na linha atual do bash?

Muitas vezes me encontro na situação em que digitei uma longa linha de comando e então percebo que gostaria de alterar uma palavra em algum lugar da linha.

Minha abordagem atual é terminar a linha, pressione Ctrl+A (para chegar ao início da linha), insira um # (para comentar a linha), pressione enter e use o ^oldword^newword sintaxe (^oldword^newword executa o comando anterior após substituir palavra antiga por palavra nova).

Mas tem que haver uma maneira melhor (mais rápida) de conseguir isso.(O mouse não é possível, já que estou em sessões ssh a maior parte do tempo).

Provavelmente existe algum comando-chave do tipo emacs para isso, que eu não conheço.

Editar:Eu tentei usar o modo vi.Algo estranho aconteceu.Embora eu seja um usuário amoroso do vim, tive sérios problemas ao usar meu amado bash.Todos aqueles movimentos dos dedos que ficaram gravados em meu subconsciente de repente pararam de funcionar.Voltei rapidamente ao modo emacs e considerei tentar o emacs como meu editor favorito (embora eu ache que a mesma coisa pode acontecer novamente).

Foi útil?

Solução

Infelizmente, não, não há realmente uma maneira melhor.Se você está cansado de pressionar as teclas, pode usar macros para reduzi-las.Adicione o seguinte ao seu ~/.inputrc:

"\C-x6": "\C-a#\C-m^"
"\C-x7": "\C-m\C-P\C-a\C-d\C-m"

Agora, em uma nova instância do bash (ou após recarregar .inputrc em seu shell atual pressionando C-x C-r), você pode fazer o seguinte:

  1. Digite um comando falso (por exemplo, ls abcxyz).
  2. Pressione Ctrl-x e depois 6.A macro insere um # no início da linha, executa a linha comentada e digita seu primeiro ^.
  3. Digite sua correção (por exemplo, xyz^def).
  4. Pressione Ctrl-x e depois 7.A macro conclui sua substituição, depois sobe para a linha anterior (comentada), remove o caractere de comentário e a executa novamente.

Não é exatamente elegante, mas acho que é o melhor que você conseguirá com o readline.

Outras dicas

no ksh, no modo vi, se você pressionar 'v' enquanto estiver no modo de comando, uma sessão vi completa será gerada no conteúdo da sua linha de comando atual.Você pode então editar usando toda a gama de comandos vi (pesquisa global e substituição no seu caso).Quando :wq do vi, o comando editado é executado.Tenho certeza de que existe algo semelhante para o bash.Como o bash tende a estender seus antecessores, provavelmente existe algo semelhante.

Bom dia,

Que tal usar o modo vi?Basta digitar set -o vi

Então você pode ir até a palavra que deseja alterar e apenas fazer um cw ou cW dependendo do que está na palavra?

Ops, esqueci de adicionar um ESC k a o na linha anterior do histórico de comandos.

O que você normalmente usa como editor?

Saúde, Rob

Editar:O que esqueci de dizer na minha resposta original foi que você precisa pensar na linha de comando do vi no bash usando os comandos que você insere quando está no modo "ex" no vi, ou seja,depois de inserir os dois pontos.

A pior coisa é que você precisa percorrer seu histórico de comandos usando os antigos comandos vi de h (para a esquerda) e l (para a direita).Você pode usar w (ou W) para saltar entre as palavras.

Depois de se acostumar, você terá todos os tipos de comandos disponíveis, por exemplo.inserir ESC / my_command examinará seu histórico, o mais recente primeiro, para encontrar a primeira ocorrência da linha de comando contendo o texto my_command.Depois de descobrir isso, você poderá usar n para encontrar a próxima ocorrência, etc.E N para inverter a direção da pesquisa.

Eu iria ler a página de manual do bash para ver o que está disponível no modo vi.Depois de superar o fato de que as setas para cima e para baixo são substituídas por ESC k e depois j, você verá que o modo vi oferece mais do que o modo emacs para edição de linha de comando no bash.

IMHO naturalmente!(-:

Emacs?Oitenta megas e trocando constantemente!

obrigada Roubar

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top