Яку команду Bash я можу використовувати для перетворення рядка верхнього регістру в нижній регістр і навпаки?
Дякую.
Яку команду Bash я можу використовувати для перетворення рядка верхнього регістру в нижній регістр і навпаки?
Дякую.
Відповіді:
Якщо рядок вже зберігається у змінній, ви можете використовувати 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 .
${string,,}Позначення існує тільки для Баш версії 4+. Інакше потрібне одне з інших рішень, наприклад $(echo $string | tr '[:upper:]' '[:lower:]').
Існує дуже мало методів, які правильно працюють з 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Ą
gawkтиповий awk (як показано на update-alternatives --display awk). Ви впевнені mawk, що за умовчанням встановлено 13.10?
sedз 1990 р. підтримують цей \Uваріант ;-). Не є особливою особливістю gnu-sed. Інакше чудова відповідь, стільки варіантів, так мало часу ;-) Успіхів усім!
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
Я б використовував внутрішній набір типу 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.
Я все ще використовую синтаксис набору, коли працюю над неоднорідним середовищем, тому мені не доведеться переписувати свої сценарії.
typesetвін вважається оприлюдненим і замінений наdeclare
Ви можете це зробити за допомогою trкоманди.
У терміналі ( Ctrl+ Alt+ T)
Ця команда:
echo 'String here' | tr "[:lower:]" "[:upper:]"
перетворить малі літери в великі регістри.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
перетворить великі регістри в малі.
Приклад:

Кредит йде на кібер-міста
tr A-Z a-zбуде працювати.
Це не чисте баш-рішення, але ви можете передавати свої струни perl(як це робив Оліsed ):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
І \Lматиме протилежний ефект:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
Використовуйте цю просту команду для верхнього та нижнього регістру, де 'f' - це ім'я файлу, у якому потрібно здійснити перетворення.
tr "A-Z" "a-z" < f
Для нижнього та верхнього регістру
tr "a-z" "A-Z" < f