Führen Sie den letzten Befehl aus, wobei alle Buchstaben in Kleinbuchstaben umgewandelt werden


15

Oft habe ich einen Befehl mit allen Buchstaben in Großbuchstaben ausgeführt (möglicherweise, weil aktiviert CapsLock), und ich habe gedrückt, Enterbevor ich dies bemerkte.

Wie kann ich den letzten Befehl ausführen, wobei alle Buchstaben in Kleinbuchstaben umgewandelt werden?


Schade, dass Sie zsh nicht verwenden. !!:l.
Kevin

Antworten:


19

Sie können dies erreichen, indem Sie die folgende kleine Funktion (ich nenne es ??sehr einfach, aber Sie können dies ändern, wie Sie möchten) in Ihre .bashrcDatei einfügen:

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

Als nächstes, wenn Sie ausgeführt werden:

?? !!

Der letzte Befehl wird mit allen Kleinbuchstaben ausgeführt.

Erläuterung

  • !!: Dies ist Teil der Verlaufstools von bash, insbesondere wird es bis zur letzten Befehlsausführung erweitert . So wird beispielsweise echo !!der letzte in dieser speziellen Shell-Sitzung ausgeführte Befehl gedruckt.
  • "${@,,}: Das Konstrukt ${foo,,} konvertiert den Inhalt der Variablen $fooin Kleinbuchstaben. $@ist das Array von Positionsparametern. Wenn es in einer Funktion verwendet wird, wird es auf die Parameter erweitert, die an diese Funktion übergeben werden.

Also "${@,,}"wird einfach alles, was an die Funktion übergeben wurde, in Kleinbuchstaben umgewandelt und dann ausgeführt. Wenn Sie die ??Funktion daher !!als Parameter ausführen, wird der letzte Befehl in Kleinbuchstaben umgewandelt und ausgeführt.


7
Vielleicht könnten Sie eine Erklärung hinzufügen, wie das funktioniert? Es ist sehr kryptisch, wie Sie es geschrieben haben. Es funktioniert auch nicht wirklich als solches. Wie Sie es geschrieben haben, funktioniert es nur dann richtig, wenn Ihre PWD leer ist. Sie müssen das zitieren "!!".
Terdon

1
@terdon Nun, dank glenn sollte es auf jeden Fall funktionieren ... Und es gibt nicht zu viel zu erklären: Die Funktion ??konvertiert ihre Argumente Buchstaben in Kleinbuchstaben und !!schreibt automatisch den vorherigen Befehl im aktuellen Befehl neu (so ??nimmt as Argument den vorherigen Befehl).
Radu Rădeanu

6
`Echo !! | tr '[: upper:]' '[: lower:]' '

Der Schlüssel befindet sich in den `Anführungszeichen (Backticks) - die Ausgabe wird als Befehl ausgeführt.


2
Die Backticks waren in der ersten Version der Antwort aufgrund der Auszeichnungssprache nicht sichtbar. Keine Notwendigkeit (ohne Kommentar) dafür abzustimmen; einfach bearbeiten.
Rmano

trwäre auch meine erste wahl. Funktioniert auch (alternativ zu Backticks und ohne die POSIX-Bracket-Klassen):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua

4

Hier kommt eine Antwort des Programmierers ... benutze Python:

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

Oder Ruby:

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

Oder Perl (wahrscheinlich mein Favorit):

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

Oder PHP:

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

Oder Awk:

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

Oder Sed:

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

Oder Bash:

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

Oder zsh

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

Oder NodeJS, wenn Sie es haben:

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

Sie könnten auch dd(aber ich würde nicht!) Verwenden :

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

Sie können auch ein kleines Skript erstellen, um die Aufgabe zu erledigen:

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

Was du so verwendest:

`echo !! | lower`

1

Und der mit sed,

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

Beispiel:

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

Ausgabe:

$(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^
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.