Execute o último comando com todas as letras transformadas em minúsculas

15

Muitas vezes, executei um comando com todas as letras maiúsculas (talvez porque CapsLockestivesse ligado) e pressionei Enterantes de perceber isso.

Como posso executar o último comando com todas as letras transformadas em minúsculas?

Radu Rădeanu
fonte
Pena que você não está usando o zsh. !!:l.
22414 Kevin

Respostas:

19

Você pode fazer isso adicionando a seguinte função pequena (eu chamo ??de muito simples, mas você pode alterar isso como quiser) em seu .bashrcarquivo:

?? () { "${@,,}"; }

A seguir, quando você executará:

?? !!

o último comando será executado com todas as letras em minúsculas.

Explicação

  • !!: isso faz parte das ferramentas de histórico do bash, especificamente, se expande para a última execução do comando . Assim, por exemplo, echo !!imprimirá o último comando executado nesta sessão shell específica.
  • "${@,,}: A construção ${foo,,} converterá o conteúdo da variável $fooconvertida em todas as letras minúsculas. $@é a matriz de parâmetros posicionais. Quando usado dentro de uma função, é expandido para os parâmetros passados ​​para essa função.

Portanto, "${@,,}"basta converter o que foi passado para a função em minúsculas e depois executá-lo. Portanto, executar a ??função com !!como parâmetro converterá o último comando em minúsculas e executá-lo.

Radu Rădeanu
fonte
7
Talvez você possa adicionar uma explicação de como isso funciona? É muito enigmático a maneira como você o escreveu. Além disso, ele realmente não funciona, como tal. Como você escreveu, ele só funcionará corretamente se o seu PWD estiver vazio. Você precisa citar o "!!".
terdon
11
@terdon Agora, graças a glenn, ele deve funcionar em qualquer caso ... E não há muito o que explicar: a função ??converte suas cartas de argumentos em letras minúsculas e !!reescreve automaticamente o comando anterior no comando atual ( ??assume como argumento do comando anterior).
Radu Rădeanu
6
`eco !! | tr '[: superior:]' '[: inferior:]' '

A chave está nas `cotações (backticks) - que executam a saída como um comando.

pedrito
fonte
2
Os backticks ficaram invisíveis na primeira versão da resposta, devido à linguagem de marcação. Não há necessidade de voto negativo (sem comentário) para isso; apenas edite.
Rmano
trseria minha primeira escolha também. Também funciona (alternativa aos backticks e sem as classes de suporte POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

aqui vem uma resposta dos programadores .... use python:

`echo "print '!!'.lower()" | python`

Ou Ruby:

`echo "print '!!'.downcase" | ruby`

Ou Perl (provavelmente o meu favorito):

`perl -e "print lc('!!');"`

Ou PHP:

`php -r "print strtolower('!!');"`

Ou Awk:

`echo "!!" | awk '{ print tolower($1) }'`

Ou Sed:

`echo "!!" | sed 's/./\L&/g'`

Ou Bash:

str="!!" ; ${str,,}

Ou zsh

echo "A='!!' ; \$A:l" | zsh

Ou NodeJS, se você tiver:

`echo "console.log('!!'.toLowerCase());" | node`

Você também pode usar dd(mas eu não usaria!):

 `echo "!!" | dd  conv=lcase 2> /dev/null`

Você também pode criar um pequeno script para fazer o trabalho:

sudo bash -c 'cat << EOF > /usr/local/bin/lower
#!/usr/bin/python
import fileinput
print "".join(fileinput.input()).lower(),
EOF' && sudo chmod +x /usr/local/bin/lower

Que você usa assim:

`echo !! | lower`
nettux
fonte
1

E aquele com sed,

$(echo !! | sed 's/^\(.*\)$/\L\1/g')

Exemplo:

$ SUDO APT-GET UPDATE
SUDO: command not found
$ $(echo !! | sed 's/^\(.*\)$/\L\1/g')

Resultado:

$(echo SUDO APT-GET UPDATE | sed 's/^\(.*\)$/\L\1/g')
[sudo] password for avinash: 
0% [Waiting for headers] [Waiting for headers] [Waiting for headers] [Connectin^
Avinash Raj
fonte