Uruchom ostatnie polecenie ze wszystkimi literami przekształconymi na małe litery

15

Wiele razy uruchomiłem polecenie z wielkimi literami (może dlatego, że CapsLockbyło włączone) i nacisnąłem, Enterzanim zdałem sobie z tego sprawę.

Jak uruchomić ostatnie polecenie, gdy wszystkie litery są przekształcone na małe litery?

Radu Rădeanu
źródło
Szkoda, że ​​nie używasz zsh. !!:l.
Kevin

Odpowiedzi:

19

Możesz to osiągnąć, dodając ??w swoim .bashrcpliku następującą małą funkcję (nazywam to bardzo prostą, ale możesz to zmienić) :

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

Następnie, kiedy uruchomisz:

?? !!

ostatnie polecenie zostanie uruchomione ze wszystkimi literami na małe litery.

Wyjaśnienie

  • !!: jest to część narzędzi historii bash, a konkretnie rozwija się do ostatniego uruchomienia polecenia . Na przykład echo !!wydrukuje ostatnie polecenie uruchomione w tej konkretnej sesji powłoki.
  • "${@,,}: Konstrukt ${foo,,} skonwertuje zawartość zmiennej $fooskonwertowanej na wszystkie małe litery. $@to tablica parametrów pozycyjnych. Gdy jest używany wewnątrz funkcji, jest rozszerzany do parametrów przekazywanych do tej funkcji.

Więc "${@,,}"po prostu skonwertuje wszystko, co zostało przekazane do funkcji na małe litery, a następnie uruchom ją. Dlatego uruchomienie ??funkcji z !!parametrem spowoduje przekonwertowanie ostatniego polecenia na małe litery i uruchomienie go.

Radu Rădeanu
źródło
7
Być może mógłbyś dodać wyjaśnienie, jak to działa? Sposób, w jaki to napisałeś, jest bardzo tajemniczy. Poza tym tak naprawdę nie działa. Jak już to napisałeś, będzie działać poprawnie tylko wtedy, gdy twój PWD jest pusty. Musisz zacytować "!!".
terdon
1
@terdon Teraz, dzięki glenn, powinno ono działać w każdym przypadku ... I nie ma nic za wiele do wyjaśnienia: funkcja ??konwertuje litery argumentów na niższe partie i !!automatycznie ponownie zapisuje poprzednie polecenie w bieżącym poleceniu ( ??przyjmuje więc jako argument poprzednie polecenie).
Radu Rădeanu
6
`echo !! | tr '[: upper:]' '[: lower:]' '

Klucz znajduje się w `cudzysłowach (backticks) - które uruchamiają dane wyjściowe jako polecenie.

pedrito
źródło
2
Backticks były niewidoczne w pierwszej wersji odpowiedzi, ze względu na język znaczników. Nie trzeba za to głosować (bez komentarza); po prostu edytuj.
Rmano
trbyłby również moim pierwszym wyborem. Działa również (alternatywa dla backticksa i bez klas nawiasów POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

nadchodzi odpowiedź programistów .... użyj python:

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

Lub Ruby:

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

Lub Perl (prawdopodobnie mój ulubiony):

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

Lub PHP:

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

Lub Awk:

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

Lub Sed:

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

Lub Bash:

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

Lub zsh

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

Lub NodeJS, jeśli go masz:

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

Możesz także użyć dd(ale nie chciałbym!):

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

Możesz również utworzyć mały skrypt do wykonania zadania:

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

Którego używasz tak:

`echo !! | lower`
nettux
źródło
1

A jeden z sed,

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

Przykład:

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

Wynik:

$(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
źródło