Команда для преобразования строки верхнего регистра в нижний регистр?

47

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

Спасибо.

rɑːdʒɑ
источник
2
Можно так же, как: unix.stackexchange.com/questions/51983/…
Сиро Сантилли lli 改造 中心 法轮功 六四 事件
2
Множество решений тоже на stackoverflow.com/questions/2264428/… С беглым взглядом большинство, кажется, здесь также охватывается.
pbhj

Ответы:

59

Если строка уже сохранена в переменной, вы можете использовать bashрасширение параметра, в частности ${parameter,,pattern}(доступно начиная с bash 4.0), где parameterэто имя вашей переменной и patternопущено:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

Обратите внимание, что это не меняет значение переменной, а только вывод. Чтобы изменить переменную, вы должны присвоить новое значение:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

Преобразование в верхнем регистре работает с ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

Это также работает со строками Unicode (по крайней мере, с текущими версиями bash, возможно, требуется как минимум bash 4.3):

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

Если вы используете zsh, вы можете использовать флаги расширения параметров ( ${(FLAGS)NAME}доступны с zsh 2.5) для достижения тех же результатов. bashСинтаксис не работает в zsh 1) . Флаг для нижнего регистра является L; для верхнего регистра это U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

Это также работает со строками Unicode (по крайней мере, начиная с zsh 5.0; я не пробовал с более ранними версиями):

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) Хотя, видя, что у zsh это было гораздо дольше, вероятно, должно быть: « zshСинтаксис не работает вbash .

Adaephon
источник
3
Запись ${string,,}существует только для bash версии 4+. В противном случае требуется одно из других решений, например $(echo $string | tr '[:upper:]' '[:lower:]').
Куинн Комендант
40

Существует очень мало методов, которые правильно работают с Unicode:

GNU sed 4.2.2 работает :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

bash 4.2.45 объявить не работает:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

Расширение параметра bash 4.2.45 не работает:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

bash 4.3.42 declareи расширение параметров работы :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 не работает:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (по умолчанию awk в Ubuntu 13.10) не работает:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

Гоук работает :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

Perl pure uc () не работает:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

Python 2 без подсказок Unicode не работает:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

Python 2 , когда поручил разобраться с Unicode работ :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

Python 3 работает :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ
Михал Шрайер
источник
1
В Ubuntu 13.04 gawkпо умолчанию используется awk (как показано на рисунке update-alternatives --display awk). Вы уверены, что mawkпо умолчанию в 13.10?
Кири
seds с 1990 года поддерживают \Uопцию ;-). Не особенность гну-седа. В противном случае отличный ответ, так много вариантов, так мало времени ;-) Удачи всем!
Оболочка
Кроме того, будут некоторые проблемы с турецким языком (пунктирная и точечная i), для получения дополнительной информации перейдите по следующим ссылкам: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
азат
В вашем примере, кошелек ucне работает в Perl, потому что вы должны use Encodeили use utf8. Перепишите ваш пример как echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'и он будет работать. Также см. Stackoverflow.com/a/13261662/3701431
Сергей Колодяжный
20

Я бы использовал внутреннюю команду набора или объявления bash для определения строчной переменной.

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

Символы уменьшаются, когда значение установлено, а не когда вы набираете переменную. Так что лучше набирать текст в начале скрипта. В верхнем регистре вы можете набрать -u .

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

Это не относится к оболочке bash, которая также работает в ksh, возможно, в определении оболочки POSIX.

РЕДАКТИРОВАТЬ: Многие люди мягко указали мне на тот факт, что набор шрифтов теперь считается устаревшим на bash и заменен объявить . Обе команды эквивалентны.

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

Я сам по-прежнему использую синтаксис набора при работе в гетерогенной среде, поэтому мне не нужно переписывать свои сценарии.

Эммануэль
источник
2
+1 Невероятно, я никогда не знал этого! Кстати, некоторая дополнительная информация: я посмотрел это в руководстве, и кажется, что typesetсчитается dericated и заменен наdeclare
thom
1
@ thom спасибо, похоже, что у bash появилась жизнь, далекая от ее «корней скорлупы борна» :)
Эммануэль
17

Вы можете сделать это с помощью trкоманды.

В терминале ( Ctrl+ Alt+ T)

Эта команда:

echo 'String here' | tr "[:lower:]" "[:upper:]"

преобразует строчные в прописные.

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

преобразует прописные буквы в строчные.

Пример:

введите описание изображения здесь

Кредит идет в кибергород

rɑːdʒɑ
источник
2
Если вы не заботитесь о локалях, tr A-Z a-zбудет работать.
Ник Маттео
9

Вы можете также передавать вещи через sed:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

И \Lбудет иметь обратный эффект:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
Оли
источник
1

Это не просто решение для bash, но вы можете передать свои строки perl(как это сделал Олиsed ):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

И \Lбудет иметь обратный эффект:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Сильвен Пино
источник
-1

Используйте эту простую команду для прописных и строчных букв, где «f» - это имя файла, в который вы хотите выполнить преобразование.

tr "A-Z" "a-z" < f

Для нижнего и верхнего регистра

tr "a-z" "A-Z" < f
Джек
источник
1
Как отмечено в комментарии к более старому ответу , это не будет работать для некоторых языков.
Муру