Запустите последнюю команду со всеми буквами, преобразованными в нижний регистр

15

Много раз я запускал команду со всеми буквами в верхнем регистре (возможно, потому что CapsLockбыл включен), и я нажимал, Enterпрежде чем понять это.

Как я могу выполнить последнюю команду со всеми буквами, преобразованными в нижний регистр?

Раду Рэдяну
источник
Жаль, что вы не используете Zsh. !!:l,
Кевин

Ответы:

19

Вы можете сделать это, добавив ??в свой .bashrcфайл следующую небольшую функцию (я называю ее очень простой, но вы можете изменить это по своему желанию) :

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

Далее, когда вы запустите:

?? !!

последняя команда будет выполнена со всеми буквами в нижнем регистре.

объяснение

  • !!: это часть инструментов истории bash, в частности, она расширяется до последнего запуска команды . Так, например, echo !!распечатает последнюю команду, запущенную в этом конкретном сеансе оболочки.
  • "${@,,}: Конструкция ${foo,,} преобразует содержимое переменной, $fooпреобразованной во все строчные буквы. $@это массив позиционных параметров. При использовании внутри функции она расширяется до параметров, переданных этой функции.

Итак, "${@,,}"просто преобразует все, что было передано функции в нижний регистр, а затем выполняет его. Следовательно, запуск ??функции с !!параметром преобразует последнюю команду в нижний регистр и запускает ее.

Раду Рэдяну
источник
7
Возможно, вы могли бы добавить объяснение того, как это работает? Это очень загадочно, как ты это написал. Кроме того, это на самом деле не работает, как таковой. Как вы уже написали, он будет работать правильно, только если ваш PWD пуст. Вам нужно процитировать "!!".
тердон
1
@terdon Теперь, благодаря glenn, это должно работать в любом случае ... И объяснять особо нечего: функция ??преобразует свои аргументы букв в нижние и !!автоматически переписывает предыдущую команду в текущей команде (поэтому ??принимает аргумент предыдущей команды).
Раду Рэдяну
6
`эхо !! | tr '[: upper:]' '[: lower:]' `

Ключ в `кавычках (backticks) - который запускает вывод как команду.

Pedrito
источник
2
Обратные пометки невидимы в первой версии ответа из-за языка разметки. Нет необходимости понижать (без комментариев) для этого; просто отредактируйте.
Rmano
trбудет моим первым выбором тоже. Также работает (альтернатива кавычкам и без скобок-классов POSIX):$( echo !! | tr '[A-Z]' '[a-z]')
belacqua
4

тут приходит ответ программистов .... используйте python:

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

Или рубин

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

Или Perl (наверное, мой любимый):

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

Или PHP:

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

Или Awk:

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

Или сед:

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

Или Баш:

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

Или зш

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

Или NodeJS, если он у вас есть:

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

Вы также можете использовать dd(но я бы не стал!):

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

Вы также можете создать небольшой скрипт для выполнения этой работы:

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

Который вы используете так:

`echo !! | lower`
nettux
источник
1

И один с sed,

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

Пример:

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

Выход:

$(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^
Авинаш Радж
источник