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

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

Спасибо.

47
задан 3 December 2013 в 00:38

7 ответов

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

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

Эта команда:

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

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

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

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

Пример:

enter image description here

Кредит поступает в кибер-город

0
ответ дан 3 December 2013 в 00:38

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

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

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

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

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

РЕДАКТИРОВАТЬ: Многие люди мягко указали мне на тот факт, что typeset в настоящее время считается устаревшим на 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.

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

0
ответ дан 3 December 2013 в 00:38

Если строка уже сохранена в переменной, вы можете использовать расширение параметра 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}  
ἈΛΦΆΒΗΤΟΣ

< hr>


1) Хотя, учитывая, что zsh имеет это гораздо дольше, вероятно, должно быть: "синтаксис zsh не работает в [ 1118] . [одна тысяча сто двадцать восемь]

0
ответ дан 3 December 2013 в 00:38

Это не чистое решение для удара, но можно передать строки по каналу через perl (поскольку Oli сделал с sed):

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

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

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
1
ответ дан 3 December 2013 в 00:38

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

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

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

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase
0
ответ дан 3 December 2013 в 00:38

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

GNU sed 4.2.2 работы:

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

удар 4.2.45 объявляет, не работает:

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

удар 4.2.45 расширения параметра не работает:

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

удар 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 чистый 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Ą
40
ответ дан 3 December 2013 в 00:38

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

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

Для строчных и прописных букв

tr "a-z" "A-Z" < f
0
ответ дан 3 December 2013 в 00:38

Другие вопросы по тегам:

Похожие вопросы: