Какую команду 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,,}
существует только для bash версии 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
s с 1990 года поддерживают \U
опцию ;-). Не особенность гну-седа. В противном случае отличный ответ, так много вариантов, так мало времени ;-) Удачи всем!
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.
РЕДАКТИРОВАТЬ: Многие люди мягко указали мне на тот факт, что набор шрифтов теперь считается устаревшим на 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.
Я сам по-прежнему использую синтаксис набора при работе в гетерогенной среде, поэтому мне не нужно переписывать свои сценарии.
typeset
считается dericated и заменен наdeclare
Вы можете сделать это с помощью tr
команды.
В терминале ( Ctrl+ Alt+ T)
Эта команда:
echo 'String here' | tr "[:lower:]" "[:upper:]"
преобразует строчные в прописные.
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
преобразует прописные буквы в строчные.
Пример:
Кредит идет в кибергород
tr A-Z a-z
будет работать.
Это не просто решение для bash, но вы можете передать свои строки 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