Команда перетворити верхній регістр у нижній регістр?


47

Яку команду Bash я можу використовувати для перетворення рядка верхнього регістру в нижній регістр і навпаки?

Дякую.



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 .


3
${string,,}Позначення існує тільки для Баш версії 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?
кірі

sedз 1990 р. підтримують цей \Uваріант ;-). Не є особливою особливістю gnu-sed. Інакше чудова відповідь, стільки варіантів, так мало часу ;-) Успіхів усім!
обстріл

Плюс виникнуть деякі проблеми з турецькою мовою (пунктирними та безлікарними i), для більш детального ознайомлення з наступними посиланнями: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/23524231/… - en.wikipedia. org / wiki / Dotted_and_dotless_I
azat

У вашому прикладі гаманець 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.

EDIT: Багато людей обережно вказали мені на те, що набір тепер вважається застарілим на bash і замінений на delete . Обидві команди рівноцінні.

$ 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 Неймовірно, я ніколи цього не знав! btw деяка додаткова інформація: я переглянув це в посібнику, і, здається, typesetвін вважається оприлюдненим і замінений наdeclare
1313

1
@що дякую, здається, що Баш почав мати життя далеко від своїх "корінь панцирної оболонки" :)
Еммануель

17

Ви можете це зробити за допомогою trкоманди.

У терміналі ( Ctrl+ Alt+ T)

Ця команда:

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

перетворить малі літери в великі регістри.

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

перетворить великі регістри в малі.

Приклад:

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

Кредит йде на кібер-міста


2
Якщо ви не переймаєтесь локалями, також tr A-Z a-zбуде працювати.
Нік Маттео

9

Ви також можете переглядати речі sed:

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

І \Lматиме протилежний ефект:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

Це не чисте баш-рішення, але ви можете передавати свої струни 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
Як зазначається в коментарі до попередньої відповіді , для деяких місцевостей це не працюватиме.
муру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.